★★★★Tarjan算法详解
来源:互联网 发布:单片机中断编写生日歌 编辑:程序博客网 时间:2024/05/16 18:23
http://blog.csdn.net/jeryjeryjery/article/details/52829142?locationNum=4&fps=1
在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。
如下图中,强连通分量有:{1,2,3,4},{5},{6}Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树。搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量。Tarjan算法有点类似于基于后序的深度遍历搜索和并查集的组合,充分利用回溯来解决问题。
在Tarjan算法中为每个节点i维护了以下几个变量:
DFN[i]:深度优先搜索遍历时节点i被搜索的次序。
low[i]:节点i能够回溯到的最早位于栈中的节点。
flag[i]:标记几点i是否在栈中。
Tarjan算法的运行过程:
1.首先就是按照深度优先搜索算法搜索的次序对图中所有的节点进行搜索。
2.在搜索过程中,对于任意节点u和与其相连的节点v,根据节点v是否在栈中来进行不同的操作:
*节点v不在栈中,即节点v还没有被访问过,则继续对v进行深度搜索。
*节点v已经在栈中,即已经被访问过,则判断节点v的DFN值和节点u的low值的大小来更新节点u的low值。如果节点v的 DFN值要小于节点u的low值,根据low值的定义(能够回溯到的最早的已经在栈中的节点),我们需要用DFN值来更新u 的low值。
3.在回溯过程中,对于任意节点u与其子节点v(其实不能算是子节点,只是在深度遍历的过程中,v是在u之后紧挨着u的节点)的 low值来更新节点u的low值。因为节点v能够回溯到的已经在栈中的节点,节点u也一定能够回溯到。因为存在从u到v的直接路 径,所以v能够到的节点u也一定能够到。
4.对于一个连通图,我们很容易想到,在该连通图中有且仅有一个节点u的DFN值和low值相等。该节点一定是在深度遍历的过 程中,该连通图中第一个被访问过的节点,因为它的DFN值和low值最小,不会被该连通图中的其他节点所影响。下面我们证 明为什么仅有一个节点的DFN和low值相等。假设有两个节点的DFN值和low值相等,由于这两个节点的DFN值一定不相同 (DFN值的定义就是深度遍历时被访问的先后
次序),所以两个的low值也绝对不相等。由于位于同一个连通图中,所以两个节点必定相互可达,那么两者的low值一定会 被另外一个所影响(要看谁的low值更小),所以不可能存在两对DFN值和low值相等的节点。
所以我们在回溯的过程中就能够通过判断节点的low值和DFN值是否相等来判断是否已经找到一个子连通图。由于该连通图中 的DFN值和low值相等的节点是该连通图中第一个被访问到的节点,又根据栈的特性,则该节点在最里面。所以能够通过不停 的弹栈,直到弹出该DFN值和low值相同的节点来弹出该连通图中所有的节点。
Tarjan算法的C++实现代码如下,可以配合上面的图加以理解:
阅读全文
0 0
- ★★★★Tarjan算法详解
- tarjan算法详解
- tarjan算法详解
- Tarjan算法详解
- Tarjan算法详解
- Tarjan算法详解
- Tarjan算法详解
- Tarjan算法详解
- Tarjan 算法超级详解
- tarjan算法的详解
- Tarjan算法详解
- Tarjan算法模板 详解
- 强连通分量-tarjan算法模板详解
- 【ACM】tarjan算法详解【强连通分量】
- 强连通算法--Tarjan个人理解+详解
- tarjan算法
- Tarjan算法
- tarjan算法
- sd卡状态监听广播
- [matlab]直方图均衡化
- 机器学习流程
- JSP学习笔记之三——关于servlet配置web.xml出现的问题
- 页面样式高度自适应的问题
- ★★★★Tarjan算法详解
- C#中的类SqlCommand对象使用方法ExecuteNonQuery()调用SQLServer存储过程时,存储过程执行成功,数据发生改变,但是返回-1
- 网页设计
- 基础技术篇 4 —— RFID技术(四)
- 协同过滤算法
- LeetCode 292:Nim Game(尼姆游戏)
- juery学习笔记一
- 凿壁系列
- 虚拟机类加载机制