图论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 分钟前
Optuna - 自动调参利器&python实例
开发语言·python·算法·机器学习
麦麦大数据9 分钟前
D025 摩托车推荐价格预测可视化系统|推荐算法|机器学习|预测算法|用户画像与数据分析
mysql·算法·机器学习·django·vue·推荐算法·价格预测
CoovallyAIHub35 分钟前
IDEA研究院发布Rex-Omni:3B参数MLLM重塑目标检测,零样本性能超越DINO
深度学习·算法·计算机视觉
豐儀麟阁贵1 小时前
4.4数组的基本操作
java·开发语言·数据结构·算法
无限进步_1 小时前
【C语言】在矩阵中高效查找数字的算法解析
c语言·开发语言·数据结构·c++·其他·算法·矩阵
小白要加油努力1 小时前
滑动窗口的典例以及思路阐述
算法
CoovallyAIHub2 小时前
一夜之间,大模型处理长文本的难题被DeepSeek新模型彻底颠覆!
深度学习·算法·计算机视觉
天选之女wow2 小时前
【代码随想录算法训练营——Day43(Day42周日休息)】动态规划——300.最长递增子序列、674.最长连续递增序列、718.最长重复子数组
算法·leetcode·动态规划
敲代码的嘎仔2 小时前
JavaWeb零基础学习Day4——Maven
java·开发语言·学习·算法·maven·javaweb·学习方法
聪明的笨猪猪3 小时前
hot 100 (1)—— 两数之和(哈希)
java·经验分享·算法·哈希算法