分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 技术分享

3732: Network

发布时间:2023-09-06 02:05责任编辑:胡小海关键词:暂无标签

3732: Network

https://www.lydsy.com/JudgeOnline/problem.php?id=3732

分析:

  最小生成树+倍增 或者 kruskal重构树。

  1、可以求出最小最小生成树,然后倍增求出两条路径的最大值。

  2、kruskal重构树,直接求出LCA即可。

  

kruskal重构树:在kruskal过程中,每次加边后,不直接连边,而是新建一个节点,节点的两个子节点分别为新边连接的两个联通块的根节点(并查集维护),节点的权值为这条边的权值。那么它有一些性质:

  1. 是一棵二叉树;
  2. 父节点的值大于等于子节点;
  3. 原图上两点间路径的最长边的最小值等于其lca的值;

那么这道题就可以建出kruskal重构树,后求出Lca即可。  

代码:

 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 ?5 inline int read() { ?6 ????int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch==‘-‘)f=-1; 7 ????for(;isdigit(ch);ch=getchar())x=x*10+ch-‘0‘;return x*f; 8 } 9 10 #define Rep(i,a,b) for (int i=(a); i<=(b); ++i)11 12 const int M = 30010;13 const int N = 15010;14 struct Edge{15 ????int u,v,w;16 ????bool operator < (const Edge &A) const {17 ????????return w < A.w;18 ????}19 }e[M];20 int fa[N<<1], deth[N<<1], f[N<<1][16], ch[N<<1][2], val[N<<1], CntNode;21 22 23 int find(int x) {24 ????return x == fa[x] ? x : fa[x] = find(fa[x]);25 }26 void dfs(int u) {27 ????if (!u) return ;28 ????deth[ch[u][0]] = deth[ch[u][1]] = deth[u] + 1;29 ????dfs(ch[u][0]);30 ????dfs(ch[u][1]);31 }32 33 int Lca(int u,int v) {34 ????if (deth[u] < deth[v]) swap(u, v);35 ????int d = deth[u] - deth[v];36 ????for (int j=15; j>=0; --j) {37 ????????if (d & (1 << j)) u = f[u][j];38 ????}39 ????if (u == v) return u;40 ????for (int j=15; j>=0; --j) 41 ????????if (f[u][j] != f[v][j]) 42 ????????????u = f[u][j], v = f[v][j];43 ????return f[u][0];44 }45 46 int main () {47 ????48 ????int n = read(), m = read(), Q = read();49 ????Rep (i, 1, m) {50 ????????e[i].u = read(), e[i].v = read(), e[i].w = read();51 ????}52 ????sort(e+1, e+m+1);53 ????54 ????Rep (i, 1, n+n) fa[i] = i;55 ????CntNode = n;56 ????Rep (i, 1, m) {57 ????????int u = find(e[i].u), v = find(e[i].v);58 ????????if (u == v) continue;59 ????????ch[++CntNode][0] = u; ch[CntNode][1] = v;60 ????????fa[u] = fa[v] = CntNode;61 ????????f[u][0] = f[v][0] = CntNode;62 ????????val[CntNode] = e[i].w;63 ????}64 ????deth[CntNode] = 1;65 ????dfs(CntNode);66 ????67 ????Rep (j, 1, 15)68 ????????Rep (i, 1, n+n)69 ????????????f[i][j] = f[f[i][j-1]][j-1];70 ????Rep (i, 1, Q) {71 ????????int u = read(), v = read();72 ????????int t = Lca(u,v);73 ????????printf("%d\n",val[Lca(u,v)]);74 ????}75 ????76 ????return 0;77 }

3732: Network

原文地址:https://www.cnblogs.com/mjtcn/p/9353132.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved