tarjan算法——边双连通分量

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

 

转载于:https://www.cnblogs.com/wuliking/p/11511602.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值