/**
割点割边挺好理解的,割点就是一个无向连通图,把其中一个点
挖掉剩下的图不连通,割边就是把一条边砍掉不连通
比如:有一个通信网络,要求一颗炸弹,把这个通信网络搞得不连通,问
炸哪个点或哪条边。
Tarjan 算法实现求割边和割点很类似,不过还是有点不同,复杂度为O(N+M)
下面用 <vector> 存边写下
*/
//求割点
#include <vector>
bool cut[nMax]; //cut[x] = ture 代表x 为割点
int dfn[nMax], low[nMax]; //dfn[x] x是当前层次,low[x] x是能到得的最低层次
//这两个或许有点摸不着头脑,不过没关系,
//查下tarjan 自己画画差不多就能理解,tarjan只是个帅哥名字,没那么可怕
vector<int> adj[nMax];
int rt, rt_num; //起始节点和访问此结点的次数,如果大于一则rt也为割点
//用于判断起始结点是否也是割点
/**
nMax为点的个数;
rt选任意一点;
rt_num = 0;
*/
void addEdge(int u, int v) {
adj[u].push_back(v);
adj[v].push_back(u);
}
void findcut(int dep, int u) {
dfn[u] = low[u] = dep;
for (int i=0; i<adj[u].size(); i++) {
int v = adj[u][i];
if (!dfn[v]) {
findcut(dep+1, v);
if (u =&#
用Tarjan算法求无向连通图割点&&割边
最新推荐文章于 2023-09-23 13:38:00 发布