zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    ios数据存储方式FMDB
    ios中的coredata
    编程岗位电话面试问答Top 50[转]
    活动图
    时序图
    用例图
    类图
    Movie
    EasyMock
    cglib应用
  • 原文地址:https://www.cnblogs.com/wuliking/p/11511602.html
Copyright © 2011-2022 走看看