tarjan 算法模板
2012-02-12 19:46
218 查看
做了一些树形DP实在不想做了看到von在玩tarjan算法,好像放假之前看过关于rmq 以及tarjan算法的说明只是没具体弄明白。今天看了一下von分享的资料不错。找了一个模板题就当tarjan算法的模板吧
http://acm.hdu.edu.cn/showproblem.php?pid=1269
判断是否为强连通图 bcnt == 1只有一个强连通分量且为自己 bcnt >1 存在多个强连通分量
View Code
http://acm.hdu.edu.cn/showproblem.php?pid=1269
判断是否为强连通图 bcnt == 1只有一个强连通分量且为自己 bcnt >1 存在多个强连通分量
View Code
#include <cstdio> #include <iostream> #include <cstring> #include <vector> #define maxn 10007 using namespace std; vector<int>g[maxn]; int DFN[maxn],LOW[maxn],Belong[maxn],stack[maxn]; bool instack[maxn]; int n,m; int bcnt,top,index; void tarjan(int i) { int j; DFN[i] = LOW[i] = ++index; stack[++top] = i; instack[i] = true; int size = g[i].size(); for (int k = 0; k < size; ++k) { j = g[i][k]; if(!DFN[j]) { tarjan(j); if(LOW[j] < LOW[i]) LOW[i] = LOW[j]; } else if(instack[j] && DFN[j] < LOW[i]) { LOW[i] = DFN[j]; } } if(DFN[i] == LOW[i]) { bcnt ++; do { j = stack[top--]; instack[j] = false; Belong[j] = bcnt; }while(j != i); } } void solve() { int i; bcnt = top = index = 0; for (i = 1; i <= n; ++i) { if(!DFN[i]) tarjan(i); } if(bcnt == 1) printf("Yes\n"); else printf("No\n"); } int main() { int i,x,y; while(cin>>n>>m) { if(!n && !m) break; for (i = 0; i <= n; ++i) { DFN[i] = LOW[i] = Belong[i] = 0; instack[i] = false; g[i].clear(); } for (i = 0; i < m; ++i) { cin>>x>>y; g[x].push_back(y); } solve(); /*for (i = 1; i <= n; ++i) { printf("%d ",Belong[i]); } printf("\n");*/ } return 0; }
相关文章推荐
- Tarjan 算法&模板
- BZOJ 2140 浅谈 Tarjan 算法及模板
- poj 1523 SPF(模板题)(Tarjan 关节点的朴素算法)
- tarjan 算法模板(边连通分量)
- Tarjan--LCA算法的个人理解即模板
- tarjan离线算法-LCA最近公共祖先算法模板(详细)
- 模板_tarjan强连通缩点算法
- LCA离线tarjan算法模板
- poj 1144 Network(模板题)(Tarjan 关节点的朴素算法)
- 算法模板——Tarjan强连通分量
- Tarjan 算法&模板
- 【算法模板】kmp
- Tarjan模板
- 算法模板之次短路
- Tarjan模板
- czl蒟蒻的模板库4——Tarjan
- STL + c++ + 模板 + 重要思维 + 基础算法+ 经典算法 + 经典实例 + 编程总结+ 心得+ 入门必会 + 知识点汇总。+string +dfs +bfs等重要算法
- AtCoder Regular Contest 092 C - 2D Plane 2N Points 贪心 匈牙利算法模板
- AC自动机算法及模板
- hiho一下 第十五周 最近公共祖先·二 - 更新一下tarjan离线LCA模板