zoukankan      html  css  js  c++  java
  • 求有向图中强连通分量的个数

    #include<cstdio>
    #include<vector>
    #include<cstring>
    using namespace std;
    const int MAX_N=10005;
    vector<int> G[MAX_N]; 
    vector<int> rG[MAX_N];//存储边反向之后的图 
    vector<int> PostOrder;//存储图的后序遍历 
    int V,E;
    bool used[MAX_N];
    int comp[MAX_N];//存储每个结点所属的联通分量 
    void addEdge(int u,int v)
    {
        G[u].push_back(v);
        rG[v].push_back(u);
    }
    void dfs(int u)
    {
        used[u]=true;
        for(int i=0;i<G[u].size();i++)
        {
            int v=G[u][i];
            if(!used[v])
                dfs(v);
        }
        PostOrder.push_back(u);
    }
    
    void rdfs(int u,int k)
    {
        used[u]=true;
        comp[u]=k;
        for(int i=0;i<rG[u].size();i++)
        {
            int v=rG[u][i];
            if(!used[v])
                rdfs(v,k);
        }
    }
    
    int scc()
    {
        memset(used,false,sizeof(used));
        for(int i=1;i<=V;i++)
        {
            if(!used[i])
                dfs(i);
        }
        memset(used,false,sizeof(used));
        int k=0;
        for(int i=PostOrder.size()-1;i>=0;i--)
        {
            int v=PostOrder[i];
            if(!used[v])
                rdfs(v,k++);
        }
        return k;
    }
    int main()
    {
        scanf("%d %d",&V,&E);
        for(int i=0;i<E;i++)
        {
            int u,v;
            scanf("%d %d",&u,&v);
            addEdge(u,v);
        }
        printf("%d
    ",scc());
        return 0;
    }
  • 相关阅读:
    web项目中加斜杠与不加斜杠
    事务是什么,以及事务四个特性
    Java中 a+=b和a=a+b有什么区别?
    JAVA基础15
    JAVA基础13
    JAVA基础12
    JAVA基础11
    JAVA基础10
    DELPHI下的SOCK编程
    设置VSS2005使支持通过Internet访问(转)
  • 原文地址:https://www.cnblogs.com/program-ccc/p/4828300.html
Copyright © 2011-2022 走看看