HDU 1269 —— 迷宫城堡
2016-04-12 22:54
260 查看
原题:http://acm.hdu.edu.cn/showproblem.php?pid=1269
思路:即强连通分量的个数为1;
思路:即强连通分量的个数为1;
#include<cstdio> #include<cstring> #include<string> #include<algorithm> using namespace std; const int maxn = 11000; const int maxm = 110000; int n, m; int head[maxn], edgenum; int DFN[maxn], Low[maxn], Stack[maxn], Belong[maxn]; bool Instack[maxn]; int Time, taj, top; struct Edge { int from, to, next; }edge[maxm]; void add(int u, int v) { edge[edgenum].from = u; edge[edgenum].to = v; edge[edgenum].next = head[u]; head[u] = edgenum++; } void init() { memset(head, -1, sizeof head); edgenum = 0; memset(DFN, -1, sizeof DFN); memset(Instack, false, sizeof Instack); Time = taj = top = 0; } void Tarjan(int u) { DFN[u] = Low[u] = ++Time; Stack[top++] = u; Instack[u] = true; for(int i = head[u];i != -1;i = edge[i].next) { int v = edge[i].to; if(DFN[v] == -1) { Tarjan(v); Low[u] = min(Low[u], Low[v]); } else if(Instack[v] && Low[u] > DFN[v]) Low[u] = DFN[v]; } if(DFN[u] == Low[u]) { taj++; while(1) { int now = Stack[--top]; Instack[now] = false; Belong[now] = taj; if(now == u) break; } } } int main() { while(~scanf("%d%d", &n, &m)) { if(n == 0 && m == 0) break; init(); while(m--) { int u, v; scanf("%d%d", &u, &v); add(u, v); } for(int i = 1;i<=n;i++) { if(DFN[i] == -1) Tarjan(i); } if(taj == 1) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- oracle物理dg安装:方法二
- GCD,NSTimer等一些发现
- centos 火狐浏览器安装adobe flash player插件
- 第三次上机作业
- Thrift白皮书阅读笔记
- wampserver无法启动及启动后数据库无法局域网内访问
- 使用hibernate进行CRUD
- 接口类
- 使用dom4j操作xml文件
- java字节码中的aload_0
- 练习7,大串中统计小串的次数
- 第四轮回 过度向量化
- Android-BaseAdapter的一些系统定义的子类
- MyBatis/Ibatis中#和$的区别
- Javascript学习笔记:闭包题解(4)
- LeetCode Merge Sorted Array 88
- web compenets
- Mac OS X下Maven的安装与配置
- 练习三:统计字符串中字符中 大写字符 小写字符 数字 其他字符 出现的次数
- 最近点对问题 Swust Oj 794