2021-1 找出图中强连通分量 理论准备

必要概念
  • 如果两个顶点是相互可达的,那么他们是强连通的。
  • 如果一幅有向图中任意两个顶点都是相互连通的,那么这个有向图也是强连通的。
  • 两个顶点是强连通的当且仅当他们都在一个普通的环中
  • 有向图的强连通性也是一种顶点之间的等价关系(自反、对称、传递)。
  • 作为一种等价关系,强连通性将所有的顶点分成一些等价类,每个等价类都是由互为强连通的顶点的最大子集组成的,这些子集被称为强联通分量

一个含有N个顶点的有向图,如果是有向无环图,那么他有N个强联通分量。如果是强连通图,那么他只有一个强联通分量。一般的,联通分量个数在1~N之间。

感性认识
  1. 强连通分量帮助教师将课程分类,哪些课是紧密相关的。
  2. 帮助生态学家理解食物链中能量的流动。
  3. 帮助软件工程师归类不同的模块,加以封装。
高效计算强连通分量: Koaraju算法
  1. 对给定有向图G的反向图G'计算他的逆后序排列点这里详细了解
  2. 按照上一步得到的顺序来访问未被标记的节点 ,在G中进行标准的dfs()
  3. 所有在同一个递归dfs()中被访问到的顶点都在同一个强连通分量中。
证明

先证明,每个和s强连通的的顶点v,一定会在调用dfs(G,s)时被访问到

用反证法,假如不能从s访问到v,说明不存在从s到v的路径,和题设s/v强连通矛盾,得证原命题成立。

再证明,按照G’逆后序调用dfs(G,s)所达的任意顶点v必然和s是强连通的。

设v是dfs(G,s)到达的某个顶点,根据上一部分证明可知,必然存在s到v的路径。下面只要证明,v到s的路径也存在,即一定强连通。

而G中存在v到s的路径,等价于G的反向图G'中,s到v的路径存在。
注意到,当前已知调用dfs(G,s)时,能访问到v,说明,在G’的逆后序中,s在前(栈顶)v在后(栈底),于是,在G’中dfs(v)只有以下两种可能:

  1. 发生在dfs(s)调用之前,(并且在dfs(s)调用之前结束)
  2. 发生在dfs(s)调用之后,(并且在dfs(s)结束之前结束)

第一种情况不可能,因为,图G'中,v到s的路径存在。第二种说明,G’中存在s到v的路径。

图例说明

在这里插入图片描述

理论清楚后,就可以写代码了。

具体实现点这里 计算强连通分量的个数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值