算法复习——图算法篇之强连通分量

本文介绍了一种求解有向图中强连通分量的有效算法,包括算法原理、框架及正确性证明。该算法首先反转图的边,然后进行两次深度优先搜索,能够以O(|V|+|E|)的时间复杂度找到所有强连通分量。

算法复习——图算法篇之强连通分量

以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!

1. 问题背景

  • 社交圈划分

    • 如何把人群按通话记录划分成不同的社交圈?
    • 如果闭环通话,说明关系相对密切;如果单向通话,说明关系相对疏远。

在这里插入图片描述

  • 强连通分量(有向图

    • 一个强连通分量是顶点的子集
    • 强连通分量中任意两点相互可达
    • 满足最大型加入新顶点,不保证相互可达
    • 特性:任意两强连通分量不相交
      • 反证易得,若相交,破坏了最大性

在这里插入图片描述

2. 问题定义

强连通分量(Strongly Connected Components)

输入:

  • 有向图 G = < V , E > G=<V, E> G=<V,E>

输出:

  • 图的所有强连通分量 C 1 , C 2 , … , C n C_1, C_2, \dots, C_n C1,C2,,Cn

在这里插入图片描述

3. 算法框架

在这里插入图片描述

步骤1:把边反向,得到反向图 G R G^R GR

在这里插入图片描述

步骤2:在 G R G^R GR上执行DFS,得到顶点完成时刻顺序 L L L

​ 例如,得到的 L L L如下所示:

在这里插入图片描述

步骤3:在 G G G上按 L L L逆序执行DFS,得到强连通分量

4. 伪代码

Strongly-Connected-Component(G)

输入:图G

输出:强连通分量

R ← {}
G_R ← G.reverse()
L ← DFS(G_R)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值