首页 > 代码库 > 【关节点+桥】关节点和桥模板 Tarjan
【关节点+桥】关节点和桥模板 Tarjan
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 1e5, M = 1e5; struct Edge { int v, next, idx; Edge(){} Edge(int _v, int _next, int _idx): v(_v), next(_next), idx(_idx){} }e[M]; int dfn[N], deep, head[N], tot; bool iscut[N], isbri[M]; void __init__() { tot = deep = 0; memset(head, -1, sizeof(head)); memset(dfn, 0, sizeof(dfn)); memset(iscut, 0, sizeof(iscut)); memset(isbri, 0, sizeof(isbri)); } void add(int u, int v, int idx) { e[tot] = Edge(v, head[u], idx); head[u] = tot++; } //lowi:i及其子孙通过回边所能走到的最早的祖先的dfn值 int dfs(int u, int fa) { int lowu = dfn[u] = ++deep;//打上时间戳,并初始化low值 int son = 0;//儿子数为0 for(int i = head[u]; ~i; i = e[i].next) { int v = e[i].v; if(!dfn[v]) {//下一个点指向儿子 son++; int lowv = dfs(v, u); lowu = min(lowu, lowv); if(lowv >= dfn[u]) iscut[u] = 1;//没有回边,是关节点 if(lowv > dfn[u]) isbri[e[i].idx] = true; } else if(dfn[v] < dfn[u] && v != fa)//指向爷爷,发现回边 lowu = min(lowu, dfn[v]);//利用回边来更新low值 } if(fa == -1 && son == 1) iscut[u] = 0;//仅仅有1个儿子的根结点不是割顶 return lowu; } int main() { __init__(); return 0; }
【关节点+桥】关节点和桥模板 Tarjan
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。