一句话之--tarjan算法、kosaraju算法,求强连通分量
来源:互联网 发布:mac sdk 配环境变量 编辑:程序博客网 时间:2024/04/29 12:45
for tarjan 一句话:用栈保存向下深搜的节点编号,并在回溯过程中找到强连通分量的根节点,以弹出栈中根节点及其上方的结点组成一个强连通分量;
for kosaraju 一句话:DFS1 同时给每一个点打上结束时间标记,再按照时间标记从后往前 DFS2(转置的矩阵,或者是边反向后的图)将强连通分量分块
给上tarjan模板
#include<bits/stdc++.h>using namespace std;/** Tarjan算法* 复杂度O(N+M)*/const int MAXN = 20010;//点数const int MAXM = 50010;//边数struct Edge{ int to,next;}edge[MAXM];int head[MAXN],tot;int Low[MAXN],DFN[MAXN],Stack[MAXN],Belong[MAXN];//Belong数组的值是1~sccint Index,top;int scc;//强连通分量的个数bool Instack[MAXN];int num[MAXN];//各个强连通分量包含点的个数,数组编号1~scc //num数组不一定需要,结合实际情况void addedge(int u,int v){ edge[tot].to = v;edge[tot].next = head[u];head[u] = tot++;}void Tarjan(int u){ int v; Low[u] = DFN[u] = ++Index; Stack[top++] = u; Instack[u] = true; for(int i = head[u];i != -1;i = edge[i].next) { v = edge[i].to; if( !DFN[v] ) { Tarjan(v); if( Low[u] > Low[v] )Low[u] = Low[v]; } else if(Instack[v] && Low[u] > DFN[v]) Low[u] = DFN[v]; } if(Low[u] == DFN[u]) { scc++; do { v = Stack[--top]; Instack[v] = false; Belong[v] = scc; num[scc]++; } while( v != u); }}void solve(int N){ memset(DFN,0,sizeof(DFN)); memset(Instack,false,sizeof(Instack)); memset(num,0,sizeof(num)); Index = scc = top = 0; for(int i = 1;i <= N;i++) if(!DFN[i]) Tarjan(i);}void init(){ tot = 0; memset(head,-1,sizeof(head));}int main(){ init();int n,m; while(cin>>n>>m) { int x,y; for(int i=1;i<=m;i++) { cin>>x>>y; addedge(x,y); } solve(n); vector< vector<int> > G(n); for(int i=1;i<=n;i++) { G[Belong[i]].push_back(i); } for(int i=1;i<=scc;i++) { for(unsigned j=0;j<G[i].size();++j) { cout<<G[i][j]<<' '; } cout<<endl; } } return 0;}
阅读全文
0 0
- 一句话之--tarjan算法、kosaraju算法,求强连通分量
- 求强连通分量——Tarjan、Kosaraju算法
- 强连通分量算法Kosaraju 和 Tarjan
- 求强连通分量之tarjan算法
- 强连通分量两种算法。tarjan和kosaraju
- 强连通分量 Kosaraju算法
- 强连通分量 -- Kosaraju算法
- 强连通分量-kosaraju算法
- 强连通分量 Kosaraju算法
- 强连通分量(Kosaraju算法)
- 求强连通分量的三种算法——Kosaraju, Tarjan, Gabow
- Tarjan算法求强连通分量
- 求强连通分量的Tarjan算法
- Tarjan算法-求强连通分量
- tarjan算法求强连通分量
- tarjan算法求强连通分量
- Tarjan算法(求强连通分量)
- tarjan算法求强连通分量
- API学习HashSet
- 彻底理解js中的闭包
- WUST OJ 1554: HLD's Fibonacci
- Flex布局详解
- STL学习之十四:常用算法 for_each 和 transform以及adjacent_find的示例代码
- 一句话之--tarjan算法、kosaraju算法,求强连通分量
- Android编程历程之Android布局文件模块化
- Android属性动画之ValueAnimator
- XZ_iOS之函数式编程和链式编程
- Java 错误:找不到或无法加载主类(源文件中含有包名 package)
- Vue.js 组件和组件通信
- 生产消费中的死锁问题
- 判断二叉树是否为完全二叉树
- 【PAT甲级】1079. Total Sales of Supply Chain (25)