tarjan算法——边双连通分量

倖福魔咒の 提交于 2019-11-29 09:49:38

简介:还是采用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 }
View Code

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!