zoukankan      html  css  js  c++  java
  • 强连通分量算法模板

      

    const int max_v = 120;
    
    struct Scc
    {
        int V;           //图的顶点数
        vector<int> G[max_v];    //原始图
        vector<int> rG[max_v];   //反向边的图
        vector<int> vs;          //后序遍历顶点列表
        bool used[max_v];        //访问标记
        int cmp[max_v];          //所属强连通分量的拓扑排序
        void init()
        {
            for(int i=0; i<=V; i++) G[i].clear(), rG[i].clear();
        }
        void add_edge(int from, int to)
        {
            G[from].push_back(to);
            rG[to].push_back(from);
        }
        void dfs(int v)
        {
            used[v] = true;
            for(int i=0; i<G[v].size(); i++)
                if(!used[G[v][i]]) dfs(G[v][i]);
            vs.push_back(v);
        }
        void rdfs(int v, int k)
        {
            used[v] = true;
            cmp[v] = k;
            for(int i=0; i<rG[v].size(); i++)
                if(!used[rG[v][i]]) rdfs(rG[v][i], k);
        }
        int scc()
        {
            memset(used, 0, sizeof(used));
            vs.clear();
            for(int v=1; v<=V; v++)
                if(!used[v]) dfs(v);
            memset(used, 0, sizeof(used));
            int k = 1;
            for(int i=vs.size()-1; i>=0; i--)
                if(!used[vs[i]]) rdfs(vs[i], k++);
            return k-1;
        }
    }ss;

    使用的时候 ss.v= 7;

    ss.init();

    ss.add_edge() ..

    ss.scc();

  • 相关阅读:
    js看懂funid与funname各自的作用以及回显示是怎么找到对应位置的
    居然脑海中还记得03年的瑞星升级ID号
    [恢]hdu 2186
    [恢]hdu 2109
    [恢]hdu 2140
    [恢]hdu 2160
    [恢]hdu 2101
    [恢]hdu 2162
    [恢]hdu 2201
    [恢]hdu 2163
  • 原文地址:https://www.cnblogs.com/xingxing1024/p/5180636.html
Copyright © 2011-2022 走看看