#include <cstdio> #include <cstring> #include <algorithm>using namespace std;const int N = 1e5, M = 1e5;st ruct 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 &Amp;& cnt = = 1) Iscut[u] = false; return low[u] = Lowu;} int main () {__init__ (); return 0;}
"Connected graph" undirected graph joint point and bridge Tarjan