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

    Kosaraju算法

    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <vector>
    #define maxn 10005
    using namespace std;
    vector<int> G[maxn],Gt[maxn]; //Gt存放补图
    vector<int> S;
    int vis[maxn];
    int sccno[maxn];              //每个节点所在强连通分量的序号
    int scc_cnt;                  //强连通分量个数
    int outdegree[maxn];          //连通分量的出度
    
    void dfs1(int u){             //目的,按每个节点结束搜索的时间排序
        if(vis[u]) return;
        vis[u] = 1;
        for(int i = 0;i < G[u].size();i ++){
            dfs1(G[u][i]);
        }
        S.push_back(u);
    }
    void dfs2(int u){
        if(sccno[u])    return;
        sccno[u] = scc_cnt;
        for(int i = 0;i < Gt[u].size();i ++){
            dfs2(Gt[u][i]);
        }
    }
    void find_scc(int n){
        S.clear();
        scc_cnt = 0;
        memset(sccno,0,sizeof(sccno));
        memset(vis,0,sizeof(vis));
        memset(outdegree,0,sizeof(outdegree));
        for(int i = 1;i <= n;i ++){
            dfs1(i);
        }
        for(int i = n-1;i >= 0 ;i --){
            if(!sccno[S[i]]){
                scc_cnt ++;
                dfs2(S[i]);
            }
        }
    }
  • 相关阅读:
    开涛spring3(6.5)
    开涛spring3(6.4)
    开涛spring3(6.3)
    开涛spring3(6.2)
    开涛spring3(6.1)
    开涛spring3(5.4)
    开涛spring3(5.3)
    开涛spring3(5.1&5.2)
    开涛spring3(4.4)
    开涛spring3(4.3)
  • 原文地址:https://www.cnblogs.com/zhangjialu2015/p/5662121.html
Copyright © 2011-2022 走看看