算法竞赛——强连通分量

强连通分量

强连通的定义是:有向图 G 强连通是指,G 中任意两个结点连通。
在这里插入图片描述

强连通分量(Strongly Connected Components,SCC)的定义是:极大的强连通子图也可以说,在强连图图的基础上加入一些点和路径,使得当前的图不在强连通,称原来的强连通的部分为强连通分量。
在这里插入图片描述

DFS生成树

DFS生成树是根据DFS搜索顺序构成的一颗生成树,形如(自上而下,自左而右):
在这里插入图片描述

有向图的 DFS 生成树主要有 4 种边:
树边(tree edge):示意图中以黑色边表示,每次搜索找到一个还没有访问过的结点的时候就形成了一条树边。
反祖边、反向边(back edge):示意图中以红色边表示(即7->1 ),也被叫做回边,即指向祖先结点的边。
横叉边(cross edge):示意图中以蓝色边表示(即 9->7 ),它主要是在搜索的时候遇到了一个已经访问过的结点,但是这个结点 并不是 当前结点的祖先。
前向边(forward edge):示意图中以绿色边表示(即 3->6 ),它是在搜索的时候遇到子树中的结点的时候形成的。可以看出树边其实是一个特殊的前向边。

两者联系

考虑 DFS 生成树与强连通分量之间的关系。

如果结点 u 是某个强连通分量在搜索树中遇到的第一个结点,那么这个强连通分量的其余结点肯定是在搜索树中以 u为根的子树中。结点 u被称为这个强连通分量的根。

反证法:假设有个结点 v在该强连通分量中但是不在以 u为根的子树中,那么 u到 v的路径中肯定有一条离开子树的边。但是这样的边只可能是横叉边或者反祖边,然而这两条边都要求指向的结点已经被访问过了,这就和 u 是第一个访问的结点矛盾了,命题得证。

Tarjan 算法求强连通分量

在 Tarjan 算法中为每个结点 u维护了以下几个变量:

d f n u dfn_{u} dfnu:深度优先搜索遍历时结点 u被搜索的次序。
l o w u low_{u} lowu:能够回溯到的最早的已经在栈中的结点。设以 u为根的子树为 S u b t r e e u Subtree_{u} Subtreeu l o w u low_u lowu 定义为以下结点的 dfn的最小值: S u b t r e e u Subtree_u Subtreeu中的结点;从 S u b t r e e u Subtree_u Subtreeu 通过一条不在搜索树上的边能到达的结点。
一个结点的子树内结点的 dfn 都大于该结点的 dfn。

从根开始的一条路径上的 dfn 严格递增,low 严格非降。

按照深度优先搜索算法搜索的次序对图中所有的结点进行搜索。在搜索过程中,对于结点 u和与其相邻的结点 v(v 不是u 的父节点)考虑 3 种情况:
v 未被访问:继续对 v进行深度搜索。在回溯过程中,用 l o w v low_v lowv更新 l o w u low_u

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值