zoukankan      html  css  js  c++  java
  • POJ 2553 Tarjan

    题意:如果v点能到的所有点反过来又能到v点,则v点是sink点,排序后输出所有的sink点。
    思路:Tarjan缩点,输出所有出度为0的连通块内的点。
    PS:一定要记得把数组清零!!!!!!!否则自己怎么死的都不知道。
    原题请戳这里

    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cstring> 
    #include<algorithm>
    using namespace std;
    int dfn[5005],low[5005],p[5005],out[5005],n,m,t,cnt;
    bool vis[5005];
    vector<short>v[5005];
    stack<short>stk;
    priority_queue<int,vector<int>,greater<int> >pq;
    void tarjan(int x)
    {
        vis[x]=1,stk.push(x),low[x]=dfn[x]=cnt++;
        for(int i=0;i<v[x].size();i++)
            if(!dfn[v[x][i]])
                tarjan(v[x][i]),low[x]=min(low[x],low[v[x][i]]);
            else if(vis[v[x][i]])
                low[x]=min(low[x],dfn[v[x][i]]);
        if(low[x]==dfn[x]){
            int y;t++;
            do y=stk.top(),stk.pop(),vis[y]=0,p[y]=t;while(y!=x);
        }
    }
    void find(int x){for(int i=1;i<=cnt;i++)if(p[i]==x)pq.push(i);}
    int main()
    {
        register int xx,yy;
        while(scanf("%d",&n)&&n)
        {
            memset(out,0,sizeof(out));
            memset(dfn,0,sizeof(dfn));
            memset(vis,0,sizeof(vis));
            memset(p,0,sizeof(p));
            for(int i=1;i<=n;i++)
                v[i].clear();
            cnt=t=0;
            scanf("%d",&m);
            for(int i=1;i<=m;i++)
                scanf("%d%d",&xx,&yy),v[xx].push_back(yy);
            for(int i=1;i<=n;i++)
                if(!dfn[i])tarjan(i);
            for(int i=1;i<=n;i++)
                for(int j=0;j<v[i].size();j++)
                    if(p[i]!=p[v[i][j]])  out[p[i]]++;
            for(int i=1;i<=t;i++)
                if(out[i]==0)  find(i);
            while(!pq.empty())
                printf("%d ",pq.top()),pq.pop();
            printf("
    ");
        }
    } 

    这里写图片描述

  • 相关阅读:
    11. Container With Most Water
    9. Palindrome Number
    375. 猜数字大小 II leetcode java
    leetcode 72 编辑距离 JAVA
    73. 矩阵置零 leetcode JAVA
    快速排序 JAVA实现
    63. 不同路径 II leetcode JAVA
    重写(override)与重载(overload)
    62 不同路径 leetcode JAVA
    leetcode 56 合并区间 JAVA
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532484.html
Copyright © 2011-2022 走看看