首页 > 编程语言 > 详细

tarjan算法

时间:2019-01-14 20:04:23      阅读:189      评论:0      收藏:0      [点我收藏+]
  • 强连通分量

    void tarjan(int u){
    vis[u]=true;
    LOW[u]=DFN[u]=cnt++;
    for(int v:g[u]){
        if(!DFN[v]){//没访问过继续
            tarjan(v);
            LOW[u]=min(LOW[u],LOW[v]);
        }
        else if(vis[v])//还在栈中更新
        LOW[u]=min(LOW[u],DFN[v]);
    }
    ans+=DFN[u]==LOW[u];
    }
  • 缩点
    void tarjan(int u){
    vis[u]=true;
    LOW[u]=DFN[u]=cnt++;
    Q.push(u);//入栈
    for(int v:g[u]){
        if(!DFN[v]){//没访问过继续
            tarjan(v);
            LOW[u]=min(LOW[u],LOW[v]);
        }
        else if(vis[v])//还在栈中更新
        LOW[u]=min(LOW[u],DFN[v]);
    }
    ans+=DFN[u]==LOW[u];
    if(DFN[u]==LOW[u]){
        int x;
        do{
            x=Q.top();
            Q.pop();
            vis[x]=0;
            num[x]=ans;
        }while(u!=x);
    }
    }
  • tarjan算法

    原文:http://blog.51cto.com/14093713/2342630

    (0)
    (0)
       
    举报
    评论 一句话评论(0
    关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
    © 2014 bubuko.com 版权所有
    打开技术之扣,分享程序人生!