图论——无向图的连通性
无向图
lllllan.
盛意以江河,江河不及你
展开
-
双连通分量
概念 点双连通: 在一个连通图中选任意两点,如果它们之间至少存在两条“点不重复”的路径,成为点双连通。 点双连通分量: 一个图中的点双连通极大子图。点双连通分量是一个“可靠”的图,去掉任意一个点,其他点仍然是连通的。也就是说,点双连通分量中没有割点。 边双连通: 在一个连通图中任意选两点,如果它们之间至少存在两条“边不重复”的路径,成为边双连通。 边双连通分量: 一个图中的边双连通极大子图。边双连通图中没有割边。 点双连通分量 求解点双连通分量和求割点密切相关。不同的点双连通分量最多只有一个公共点,即原创 2020-08-25 15:49:29 · 487 阅读 · 1 评论 -
UVA796 Critical Links【输出割边】
Critical Links 题意: 按字典序输出图中的所有割边。 题解: 存入set会自动排序,注意每组输出之间多一个空行。 #include<algorithm> #include<iostream> #include<set> using namespace std; #define _for(i, a, b) for(int i = (a); i <= (b); ++i) const int N = 1e3 + 10; const int M...原创 2020-11-16 11:43:40 · 93 阅读 · 0 评论 -
UVA315 Network【割点水题 -- tarjan】
Network 题意: 求出无向图中的割点数量 #include<algorithm> #include<iostream> #include<vector> using namespace std; #define _for(i, a, b) for(int i = (a); i <= (b); ++i) const int N = 110; int n, dfn, cut[N]; int num[N], low[N]; vector<in...原创 2020-11-15 09:21:05 · 90 阅读 · 0 评论 -
POJ3177 Redundant Paths【边双连通分量 -- 重边 + tarjan缩点】
Redundant Paths 题意: 给定一个无向连通图,问最少加多少条边可以变成边双连通图。 题解: 将每个边双缩成单个点之后,图上就会剩下一棵树,而最后的答案也就变成了(度数为1的节点个数 + 1)/ 2 #include<algorithm> #include<iostream> #include<vector> using namespace std; #define _for(i, a, b) for(int i = (a); i <= ...原创 2020-11-15 08:35:05 · 123 阅读 · 0 评论 -
HDU3749 Financial Crisis——点双连通分量(tarjan+并查集)
点这里 题意: 给定一个无向图,后续有q个查询,问你u点与v点之间有几条(除了首尾两点外,其他点不重复)的路径。如果有0条或1条输出zero或one,如果有2条以上,输出two or more。 题解: 求割点很容易,判断两点连通是否连通也只需要借助并查集,但至于两点间有多少不重复路径,需要另开数组记录。 s[N]: 采用并查集的方式判断连通性。 vector vec[N]: 记录第i个连通分块下的所有节点。并用tag[N]记录第i个节点当时属于哪个连通分块(一个节点可以属于多个连通分块,只...原创 2020-08-29 09:01:44 · 163 阅读 · 0 评论 -
HDU4587 TWO NODES——割点(枚举+tarjan)
点这里 题意: 一个无向图G,求在删除任意两个点以后的最大割点数。 题解: 需要删除两个点,此时枚举删除第一个点,此时要清楚删除这个点以后有多少个连通分块block然后去求tarjan,而iscut[]就用来计算每个点删除以后能够产生多少连通分块,第二个点选其最大值即可。最后的答案就是max(iscut[i] + block[i]) - 1。 过程中犯的错: iscut[i]–: 注意这个出现的位置,需要减的都是根节点,特意减一是因为,一旦这个连通分块只有根节点一个点,而我第二个点又刚好选...原创 2020-08-28 18:30:51 · 153 阅读 · 0 评论 -
HDU 3394 Railway——点双连通分量(tarjan+割边)
点这里 题意: 给定一个无向图,要求输出图中多余边和冲突边的数量。 题解: 多余边就是割边,求割边套模板就能做。冲突边:一个点双连通分量中如果边数大于点数,则所有边都是冲突边。 #include<bits/stdc++.h> using namespace std; const int N = 1e4 + 10; int n, m, u, v; int ans1, ans2, ds_cnt, dfn; int low[N], num[N], vis[N]; vector<...原创 2020-08-26 16:50:56 · 187 阅读 · 0 评论 -
POJ 1523 SPF——割点(tarjan)
点这里 题意: 给定一个无向图,判断图中是否含有割点,如果有,请输出每个割点的编号以及删除该割点以后会分割成几个连通分块。输出格式为SPF node ? leaves ? subnets没有割点则输出No SPF nodes。 题解: 只是在tarjan求割点的模板上,追问了一个连通分块的问题,变化只在于if(low[v] >= num[u] && u != 1) iscut[u] = true;应该改成ans[u]++;ans[]用来统计某割点删除后能将图分割成多少个连...原创 2020-08-26 14:20:30 · 120 阅读 · 0 评论 -
HDU2460 && POJ3694 Network——割边(tarjan+LCA)
点这里 题意: 给定一张无向图,有q次插入,每次插入一条新边,并输出插入后桥(割边)的数量。 题解: 在插入之前跑一遍tarjan先计算原有割边的数量。后来每次插边都做一次LCA,将插边的端点x和端点y到其最近的公共祖先点路上的所有割边全部删除。 过程中犯的错: 重边。 看样例二就应该清楚,这道题是有重边的。 数组大小。 采用了链式前向星的存图方式,一共有二十万条边,因为是无向图,所以每条边都要用两条有向边表示,因此数组大小应该开四十万。 割边计算。 看书的时候,说是去掉一个等号,计算割点...原创 2020-08-26 11:00:53 · 149 阅读 · 0 评论 -
POJ3352 Road Construction——边双连通分量(tarjan+缩点)
点这里 题意: 给定一个无向图G,图中没有重边。问添加几条边才能使无向图变成边双连通图。 题解: 缩点。 方法参考双连通分量。 过程中犯的错: ans计数: 程序里tarjan函数里有一行批成注释代码,那是错误的。 #include<iostream> #include<algorithm> #include<vector> using namespace std; const int N = 1e3 + 10; int n, m, dfn, low[N]; v原创 2020-08-25 16:21:55 · 314 阅读 · 0 评论 -
POJ1144 Network——割点(tarjan)
点这里 题意: 输入一个无向图,求割点的数量。 题解: 模板题,注意输入就可以了,剩下的套模板就能解决。 #include<iostream> #include<algorithm> #include<cstring> #include<vector> using namespace std; const int N = 110; int n, ans, dfn; int num[N], low[N]; bool iscut[N]; vector<原创 2020-08-25 10:03:34 · 187 阅读 · 0 评论