图论17-有向图的强联通分量-Kosaraju算法

文章目录

  • [1 概念](#1 概念)
  • [2 Kosaraju算法](#2 Kosaraju算法)
    • [2.1 在图类中设计反图](#2.1 在图类中设计反图)
    • [2.2 强连通分量的判断和普通联通分量的区别](#2.2 强连通分量的判断和普通联通分量的区别)
    • [2.3 代码实现](#2.3 代码实现)

1 概念


2 Kosaraju算法

对原图的反图进行DFS的后序遍历。

2.1 在图类中设计反图

c 复制代码
// 重写图的构造函数
    public Graph(TreeSet<Integer>[] adj, boolean directed){

        this.adj = adj;
        this.directed = directed;
        this.V = adj.length;
        this.E = 0;

        indegrees = new int[V];
        outdegrees = new int[V];
        for(int v = 0; v < V; v ++)
            for(int w: adj[v]){
                outdegrees[v] ++;
                indegrees[w] ++;
                this.E ++;
            }

        if(!directed) this.E /= 2;
    }

// 求反图,并且new一个图对象,参数为TreeSet
    public Graph reverseGraph(){

        TreeSet<Integer>[] rAdj = new TreeSet[V];
        for(int i = 0; i < V; i ++)
            rAdj[i] = new TreeSet<Integer>();

        for(int v = 0; v < V; v ++)
            for(int w : adj(v))
                rAdj[w].add(v);

        return new Graph(rAdj, directed);
    }

2.2 强连通分量的判断和普通联通分量的区别

强联通分量是环,意味着在DFS过程中一定是公用相同的联通分量序号。

当这个环遍历从环尾开始返回并记录ccid的时候,DFS自由返回到环, 索引指向下一个未被访问过的环外的节点,此时联通分量序号+1。 由于图是反过来的。

单步调试一下更容易理解。

2.3 代码实现

顶点:注意这里遍历的顺序是反过来的图。

并且,对翻转过来的图进行DFS后序遍历

cpp 复制代码
        GraphDFS dfs = new GraphDFS(G.reverseGraph());

        ArrayList<Integer> order = new ArrayList<>();
        for(int v: dfs.post())
            order.add(v);

        Collections.reverse(order);

        for(int v: order) //注意这里遍历的顺序是反过来的图
            if(visited[v] == -1){
                dfs(v, scccount);
                scccount ++;
            }

但是在DFS的时候,判断邻边用的是原来的邻接列表。

c 复制代码
    private void dfs(int v, int sccid){

        visited[v] = sccid;
        for(int w: G.adj(v))
            if(visited[w] == -1)
                dfs(w, sccid);
    }
相关推荐
黑不拉几的小白兔6 分钟前
PTA部分题目C++重练
开发语言·c++·算法
迷迭所归处7 分钟前
动态规划 —— dp 问题-买卖股票的最佳时机IV
算法·动态规划
chordful28 分钟前
Leetcode热题100-32 最长有效括号
c++·算法·leetcode·动态规划
_OLi_36 分钟前
力扣 LeetCode 459. 重复的子字符串(Day4:字符串)
算法·leetcode·职场和发展·kmp
Romanticroom43 分钟前
计算机23级数据结构上机实验(第3-4周)
数据结构·算法
白藏y44 分钟前
数据结构——归并排序
数据结构·算法·排序算法
ahadee1 小时前
蓝桥杯每日真题 - 第12天
c++·vscode·算法·蓝桥杯
zhentiya1 小时前
微积分第五版课后习题答案详解PDF电子版 赵树嫄
算法·pdf
luky!2 小时前
算法--解决熄灯问题
python·算法
鸽鸽程序猿2 小时前
【算法】【优选算法】二分查找算法(下)
java·算法·二分查找算法