强连通分量算法模板

  

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();

posted @ 2016-02-03 22:40  xing-xing  阅读(349)  评论(0编辑  收藏  举报