Tarjan 算法的伪代码实现 及 求割点的思路浅谈
来源:互联网 发布:最优化方法王开荣pdf 编辑:程序博客网 时间:2024/05/03 09:50
Tarjan算法的伪代码实现 及 求割点的思路浅谈
1Tarjan算法求强连通分量
设置DFN[], LOW[],数组进行搜索。DFN[S],代表S的时间戳, 也就是S的地位。而LOW[S]代表S能追寻的先祖节点的时间戳,把未放入过的节点放入栈中, 如果搜到底回溯时发现DFN[S] = LOW[S], 那么便把栈中包括S和S之后的节点弹出, 这些节点便是一个连通分量。
Tarjan算法的伪代码实现
Void tarjan(int S)
{
Stack.push(S); // 把S放入栈中。
Vis[S] = 1;// 表示S节点在栈中。
DFN[S] = LOW[S] = ++FLAG // 初始化时间戳及先祖地位。
For( T 属于 S的son) // 遍历所有S的子节点。
If(vis[T] == 0) // 如果 T 不在栈中
{
Tarjan(T); //继续向下搜索。
LOW[S] = MIN(LOW[S], LOW[T]). //更新S节点的先祖地位。
}
Else if(vis[T] == 1) //S节点 正在栈中。
{
LOW[S] = MIN(LOW[S], DFN[T]). // 更新S节点的先祖地位。
}
If(LOW[S] == DNF[S]) // 如果 S节点的先祖地位就是他自己 那么他就是一个强连通分量的ROOT。
{
DO{
Pop T // 弹出T
Vis[T] = 2; // 表示T节点已经进入过并弹出
T = stack.top; //更新T
}While(S != T) // 一直弹到本强连通分量的ROOT为止。 弹出的节点便是一个强连通分量。
}
}
2Tarjan算法求割点
1. 如果S这个节点是根节点, 并且他有两个或两个以上的子节点, 那么S节点必然是割点。
2, 如果S节点不是根节点, 那么我们可以设置DFN[], LOW[],数组进行搜索。 DFN[S],代表S的时间戳, 也就是S的地位。而LOW[S]代表S能追寻的先祖节点的时间戳, 如果用Tarjan算法实现, 发现关于S节点存在S节点的子节点T,T的LOW[T] >= DFN[S], 也就是说T的最高先祖地位不超过S节点, 那么S节点断了, T和T之后的节点便会与之前的图断开, 所以S便为割点。
注:这些都是我自己的想法,不一定精准, 如有错误, 请各位大牛指出, 谢谢。
- Tarjan 算法的伪代码实现 及 求割点的思路浅谈
- tarjan算法的实现
- ELM的算法及伪代码
- PHP Dispath的实现思路及代码
- Tarjan算法的C++实现
- KMP算法的理解,伪代码,c代码实现
- 算法伪代码的写法
- BZOJ 2140 浅谈 Tarjan 算法及模板
- ASP.NET 大文件下载的实现思路及代码
- Jquery实现图片放大镜效果的思路及代码
- 实现杨辉三角的思路及代码
- ASP.NET 大文件下载的实现思路及代码
- 模拟鼠标事件的实现思路及代码
- 多线程_多线程方式2的思路及代码实现
- 多线程_多线程方式3的思路及代码实现
- 多线程-多线程方式2的思路及代码实现
- tarjan算法的原理和实现
- 求割点模板(tarjan算法思路)
- 常见数据结构题
- 黑马程序员——Java之字符串与基本类型包装类
- [Java]快速排序算法的Java实现
- ORACLE PL/SQL编程详解之六
- 创建会计凭证(FB01)的BAPI
- Tarjan 算法的伪代码实现 及 求割点的思路浅谈
- 黑马程序员——Java之其他对象
- Qt 上下文菜单
- ubuntu 的Grub启动
- 20150321_01开博目的
- unity3d移动平台性能优化专题(11):脚本细节
- 利用ip和netmask计算相关地址的js实现
- 分类算法之逻辑回归
- hdu 1728 bfs 最小拐弯数