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 }

 

posted on 2016-07-29 20:35  pb2016  阅读(162)  评论(0编辑  收藏  举报