强连通分量 tarjan算法 C++实现
来源:互联网 发布:网络打仗游戏 编辑:程序博客网 时间:2024/05/16 00:54
tarjan(u){
DFN[u]=Low[u]=++Index // 为节点u设定次序编号和Low初值
Stack.push(u) // 将节点u压入栈中
for each (u, v) in E // 枚举每一条边
if (v is not visted) // 如果节点v未被访问过
tarjan(v) // 继续向下找
Low[u] = min(Low[u], Low[v])
else if (v in S) // 如果节点u还在栈内
Low[u] = min(Low[u], DFN[v])
if (DFN[u] == Low[u]) // 如果节点u是强连通分量的根
repeat v = S.pop // 将v退栈,为该强连通分量中一个顶点
print v
until (u== v)
}
#include <iostream>#include <vector>#include <stack>using namespace std;vector<int> v[100];stack<int> stk;int DFN[100],LOW[100];int index;bool vis[100];void TarJan(int u){ DFN[u]=LOW[u]=++index; stk.push(u); vis[u]=true; for(int w:v[u]) { if(!DFN[w]) { TarJan(w); LOW[u]=min(LOW[u],LOW[w]); } else if(vis[w]) LOW[u]=min(LOW[u],DFN[w]); } if(DFN[u]==LOW[u]) { int s; do{ s=stk.top(); stk.pop(); cout<<s<<" "; vis[s]=false; }while(u!=s); cout<<endl; }} int main(){ int n,m; cin>>n>>m; for(int i=0;i<m;++i) { int s,e; cin>>s>>e; v[s].push_back(e); } for(int i=1;i<=n;++i) { if(!DFN[i]) TarJan(i); } return 0;}
阅读全文
0 0
- 强连通分量 tarjan算法 C++实现
- 强连通分量 Tarjan算法
- 强连通分量 tarjan算法
- 强连通分量Tarjan算法
- Tarjan强连通分量算法
- 强连通分量Tarjan算法
- 强连通分量Tarjan算法
- 强连通分量 Tarjan算法
- 强连通分量-tarjan算法
- 有向图强连通分量 Tarjan算法【java实现】
- 强连通分量之tarjan算法
- Tarjan算法求强连通分量
- POJ 2186 强连通分量 Tarjan算法
- 强连通分量算法Kosaraju 和 Tarjan
- 求强连通分量的Tarjan算法
- 强连通分量-tarjan算法模板详解
- 【ACM】tarjan算法详解【强连通分量】
- 强连通分量个数的tarjan算法
- 使用函数查找字符串子串
- linux编程---进程间通信---FIFO---有名管道
- UEDITOR编辑器
- markdown语法总结
- 把远程仓库的项目,clone到eclipse里面
- 强连通分量 tarjan算法 C++实现
- centos7 下的常用命令
- Android 开源交流 github [https://github.com/aosp-exchange-group/share]
- poj 2240
- 用C/C++实现较完整贪吃蛇游戏
- VUE 全局变量的几种实现方式
- Java 实现导出excel表
- Android插件框架VirtualAPK学习和使用
- java之http协议