码迷,mamicode.com
首页 > 编程语言 > 详细

tarjan算法

时间:2019-01-14 20:16:18      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:tar   强连通分量   入栈   tarjan   int   连通   for   更新   while   

  • 强连通分量

    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算法

    标签:tar   强连通分量   入栈   tarjan   int   连通   for   更新   while   

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

    (0)
    (0)
       
    举报
    评论 一句话评论(0
    登录后才能评论!
    © 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
    迷上了代码!