简介:还是采用tarjan缩点,如果边(u,v)是桥,那么显然dfn[v]=low[v],则v此时栈中的集合为一个边连通分量。
代码:
1 void tarjan(int x,int &sccnum,int from) { 2 sta[++cnt]=x; 3 vis[x]=1; 4 dfn[x]=++lay; 5 low[x]=lay; 6 bool flag=false; 7 for(int i=head[x];~i;i=e[i].net) { 8 int v=e[i].v; 9 if(v==from&&!flag) { ///如果是重边的情况 10 flag=true; 11 continue; 12 } 13 if(!dfn[v]) { 14 tarjan(v,sccnum,x); 15 low[x]=min(low[x],low[v]); 16 } 17 else if(vis[v]==1) 18 low[x]=min(low[x],low[v]); 19 } 20 if(dfn[x]==low[x]) { ///有割边 21 ++sccnum; 22 do { 23 f[sta[cnt]]=sccnum; ///标记为同一集合 24 vis[sta[cnt]]=2; 25 }while(sta[cnt--]!=x); 26 } 27 }