前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >有向图----强连通分量问题(Kosaraju算法)

有向图----强连通分量问题(Kosaraju算法)

作者头像
SuperHeroes
发布2018-05-30 17:56:49
2K2
发布2018-05-30 17:56:49
举报
文章被收录于专栏:云霄雨霁云霄雨霁

上一篇:有向图--有向环检测和拓扑排序

有向图强连通分量:在有向图G中,如果两个顶点vi,vj间有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量。

Kosaraju算法可以用来计算有向图的强连通分量。

Kosaraju算法的实现过程:

  1. 在给定的一幅有向图G中,使用DepthFirstOrder来计算它的反向图G(R)的逆后序排列。
  2. 在G中进行标准的深度优先遍历,但要按照刚才得到的逆后序排列而非标准的顺序来访问所有未被标记的顶点。
  3. 在构造函数中,所有在同一个递归dfs()调用中被访问到的顶点都在同一个强连通分量中。

除了下面代码中标出的两行区别,Kosaraju算法的实现和求无向图的连通性问题的实现几乎完全相同。Kosaraju算法实现简单但难以理解。在知乎上看到一个对Kosaraju算法的浅显易懂的解释,可以用来帮助理解该算法的原理:https://www.zhihu.com/question/58926821/answer/163724688

实现:

代码语言:javascript
复制
public class KosarajuSharirSCC {
    private boolean[] marked;     // 已访问过的顶点
    private int[] id;             // 强连通分量的标识符
    private int count;            //强连通分量的数量

    public KosarajuSharirSCC(Digraph G) {
        marked = new boolean[G.V()];
        id = new int[G.V()];
        DepthFirstOrder dfs = new DepthFirstOrder(G.reverse());//区别
        for (int v : dfs.reversePost()) {//区别
            if (!marked[v]) {
                dfs(G, v);
                count++;
            }
        }
    }
    private void dfs(Digraph G, int v) { 
        marked[v] = true;
        id[v] = count;
        for (int w : G.adj(v)) {
            if (!marked[w]) dfs(G, w);
        }
    }
    public int count() { return count; }
    public boolean stronglyConnected(int v, int w) { return id[v] == id[w]; }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.12.21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档