首页 > 编程语言 > 详细

强连通分量算法模板

时间:2016-02-03 23:27:11      阅读:221      评论:0      收藏:0      [点我收藏+]

  

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

强连通分量算法模板

原文:http://www.cnblogs.com/xingxing1024/p/5180636.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!