首页 > 代码库 > 【连通图】无向图关节点和桥 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 low[N], dfn[N], deep, head[N], tot; bool iscut[N], isbri[M]; void __init__() { tot = deep = 0; memset(head, -1, sizeof(head)); memset(iscut, 0, sizeof(iscut)); } void add(int u, int v, int idx) { e[tot++] = Edge(v, head[u], idx); head[u] = tot++; } int dfs(int u, int fa) { int lowu = dfn[u] = ++deep; int cnt = 0; for(int i = head[u]; ~i; i = e[i].next) { int v = e[i].v; if(!dfn[v]) { cnt++; int lowv = dfs(v, u); lowu = min(lowu, lowv); if(lowv >= dfn[u]) iscut[u] = true; if(lowv > dfn[u]) isbri[e[i].idx] = true; continue ; } if(dfn[v] < dfn[u] && v != fa) lowu = min(lowu, dfn[v]); } if(fa == -1 && cnt == 1) iscut[u] = false; return low[u] = lowu; } int main() { __init__(); return 0; }
【连通图】无向图关节点和桥 Tarjan
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。