zoukankan      html  css  js  c++  java
  • poj 2553 The Bottom of a Graph 强连通Kosaraju

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <stack>
    #include <set>
    #include <map>
    #include <string>
    #include <math.h>
    #include <stdlib.h>
    #include <time.h>
    //#include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=5000+5;
    
    struct Edge
    {
        int s,t;
    };
    vector<Edge>edge;
    vector<int>g[N],gt[N];
    int n,m,vis[N],in[N],ord[N],id[N],cnt;
    
    void Addedge(int s,int t)
    {
        Edge tp;
        tp.s=s;tp.t=t;
        edge.push_back(tp);
        g[s].push_back(edge.size()-1);
        gt[t].push_back(edge.size()-1);
    }
    
    void dfs(int u)
    {
        int i,v;
        vis[u]=1;
        for(i=0;i<g[u].size();i++)
        {
            v=edge[g[u][i]].t;
            if(!vis[v]) dfs(v);
        }
        ord[cnt++]=u;
    }
    
    void dfst(int u)
    {
        int i,v;
        vis[u]=1;
        id[u]=cnt;
        for(i=0;i<gt[u].size();i++)
        {
            v=edge[gt[u][i]].s;
            if(!vis[v]) dfst(v);
        }
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        //freopen("out.txt","w",stdout);
        int i,u,v;
        while(~scanf("%d",&n)&&n)
        {
            scanf("%d",&m);
            edge.clear();
            for(i=0;i<n;i++)
            {
                g[i].clear();
                gt[i].clear();
                id[i]=i;
            }
            for(i=0;i<m;i++)
            {
                scanf("%d%d",&u,&v);
                Addedge(u-1,v-1);
            }
            cnt=0;
            memset(vis,0,sizeof(vis));
            for(i=0;i<n;i++)
            {
                if(!vis[i]) dfs(i);
            }
            cnt=0;
            memset(vis,0,sizeof(vis));
            for(i=n-1;i>=0;i--)
            {
                if(!vis[ord[i]])
                {
                    dfst(ord[i]);
                    cnt++;
                }
            }
            memset(in,0,sizeof(in));
            for(i=0;i<m;i++)
            {
                u=id[edge[i].s];
                v=id[edge[i].t];
                if(u!=v) in[u]++;
            }
            int sf=0;
            for(i=0;i<n;i++)
            {
                //printf("%d
    ",id[i]);
                if(in[id[i]]==0)
                {
                    if(sf==0) sf++;
                    else printf(" ");
                    printf("%d",i+1);
                }
            }
            printf("
    ");
        }
        return 0;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/

  • 相关阅读:
    比较字符串
    angular 兼容ie7 bootstrap2兼容ie6
    angular $watch
    CSS超过指定的宽度加省略号
    出去html中的标签
    andriod自定义视图
    andriod创建用户界面(1)
    安卓Activity生命周期(转)
    迷你版mvc框架执行过程
    【03月04日】A股滚动市盈率PE历史新低排名
  • 原文地址:https://www.cnblogs.com/xryz/p/4847782.html
Copyright © 2011-2022 走看看