#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; }
时间: 2024-10-26 12:15:50