1 ///双连通模板 2 void dfs(int u,int fa) 3 { 4 dfn[u]=low[u]=++dfs_cut; 5 vs[u]=1; 6 s.push(u); 7 int p=1; ///去重 8 for (int i=0;i<g[u].size();i++) 9 { 10 int v=g[u][i]; 11 if (v==fa&&p) 12 { 13 p=0; 14 continue; 15 } 16 if (!vs[v]) 17 { 18 dfs(v,u); 19 low[u]=min(low[u],low[v]); 20 } 21 else low[u]=min(low[u],dfn[v]); 22 } 23 24 ///缩点 25 if (low[u]==dfn[u]) 26 { 27 bcc_cut++; 28 int x; 29 while (1) 30 { 31 x=s.top(); 32 s.pop(); 33 bcc[x]=bcc_cut; 34 if (x==u) break; 35 } 36 } 37 }