[HDU 1269] 迷宫城堡 强连通分量
2015-08-21 11:49
148 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1269
题意:中文题。。
思路:Tarjan算法,赤果果的强连通分量,直接上模板
题意:中文题。。
思路:Tarjan算法,赤果果的强连通分量,直接上模板
[code]#include <stack> #include <cstdio> #include <vector> #include <cstring> #include <algorithm> using namespace std; const int maxn = 10005; stack<int> sta; vector<int> side[100005]; int time, sum; int low[maxn], dfn[maxn]; bool instack[maxn], vis[maxn]; int Tarjan(int rt) { sta.push(rt); vis[rt] = true; instack[rt] = true; low[rt] = dfn[rt] = ++time; int len = side[rt].size(); for(int i = 0; i < len; i++) { int rw = side[rt][i]; if(!vis[rw]){ Tarjan(rw); low[rt] = min(low[rt], low[rw]); } else if(instack[rw]){ low[rt] = min(low[rt], dfn[rw]); } } if(low[rt] == dfn[rt]){ int top; do{ top =sta.top(); sta.pop(); instack[top] = false; }while(top != rt); sum++; } return 0; } int main() { int n, m; while(~scanf("%d%d", &n, &m) && (n || m)){ for(int i = 0; i <= n; i++){ side[i].clear(); } int x, y; for(int i = 0; i < m; i++){ scanf("%d%d", &x, &y); side[x].push_back(y); } sum = time = 0; memset(low, 0, sizeof(low)); memset(dfn, 0, sizeof(dfn)); memset(vis, false, sizeof(vis)); memset(instack, false, sizeof(instack)); for(int i = 1; i <= n; i++){ if(!dfn[i]) Tarjan(1); } if(sum == 1){ printf("Yes\n"); } else{ printf("No\n"); } } }
相关文章推荐
- Effective c++读书笔记
- 被忽略的 UITableViewHeaderFooterView
- OutMan——Foundation框架中的NSDate类、NSCalendar类以及NSFileManager类
- 洛谷1067 多项式输出 解题报告
- XXX 不是当前用户的有效责任,请联系您的系统管理员
- Android静态图片人脸识别的完整demo(附完整源码)
- vijos - P1077克隆龙 (找规律 + 指数型母函数 + python)
- 转载文档收藏
- 做DBA必须学会的11个Linux基本命令--主要看参数
- Dex文件方法数超过65536怎么破?
- raid
- RelativeLayout用到的一些重要的属性
- 终于会用c#中的delegate(委托)和event(事件)了
- 第一个文章 测试一下
- 二分查找的方法
- 容易出错的Java笔试题
- wamp 下 Apache 局域网访问403的解决问题
- Oracle 自定义数据类型Type
- poj1276--Cash Machine(多背包被判刑了)
- 火星今天飞抵西非国家寻找埃博拉疫情