hdoj1269迷宫城堡【scc】
2015-11-18 21:12
417 查看
迷宫城堡Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10630 Accepted Submission(s): 4767 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间。Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间j到房间i。 Input 输入包含多组数据,输入的第一行有两个数:N和M,接下来的M行每行有两个数a和b,表示了一条通道可以从A房间来到B房间。文件最后以两个0结束。 Output 对于输入的每组数据,如果任意两个房间都是相互连接的,输出"Yes",否则输出"No"。 Sample Input 3 3 1 2 2 3 3 1 3 3 1 2 2 3 3 2 0 0 Sample Output Yes No Author Gardon |
#include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> #include<stack> #include<vector> using namespace std; const int maxn=100010; int MIN(int a,int b){ return a<b?a:b; } int dfs_clock,scc_cnt; int sccno[maxn]; bool instack[maxn]; int dfn[maxn]; int low[maxn]; int head[maxn]; vector<int>scc[maxn]; stack<int>S; struct Node{ int to,next; }A[maxn]; void init(){ memset(head,-1,sizeof(head)); memset(low,0,sizeof(low)); memset(instack,false,sizeof(instack)); memset(sccno,0,sizeof(sccno)); memset(dfn,0,sizeof(dfn)); dfs_clock=scc_cnt=0; } void tarjan(int u,int pre){ dfn[u]=low[u]=++dfs_clock; S.push(u);int v;instack[u]=true; for(int k=head[u];k!=-1;k=A[k].next){ v=A[k].to; if(!dfn[v]){ tarjan(v,u); low[u]=MIN(low[u],low[v]); } else if(instack[v]){ low[u]=MIN(low[u],dfn[v]); } } if(low[u]==dfn[u]){ scc_cnt++;scc[scc_cnt].clear(); while(1){ v=S.top();S.pop(); instack[v]=false; sccno[v]=scc_cnt; scc[scc_cnt].push_back(v); if(u==v)break; } } } int main() { int n,m,i,j,k; while(scanf("%d%d",&n,&m),n||m){ init();int a,b; for(i=0;i<m;++i){ scanf("%d%d",&a,&b); A[i].to=b; A[i].next=head[a]; head[a]=i; } for(i=1;i<=n;++i){ if(!dfn[i])tarjan(i,-1); } if(scc_cnt==1) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- 20151118 Set集合+HashSet类+TreeSet类
- zoj2913 Bus Pass BFS
- CocoaPosd详解
- Android Studio快捷键1、查看——2、查找——3、修改
- HDU1067 Gap
- iOS--CoreLocation的简单使用
- bootstrap四部分概述
- gateone安装(web版本ssh)
- C++ 学习 new
- CSS.DIV网页样式与布局学习总结
- 关于fpga的复位
- [NOIP2015总结]
- nyoj 8 一种排序【简单】
- ubuntu系统设置定时备份mysql
- 处理端口冲突的CMD命令
- 石子合并问题
- 初试MVVM框架之Vue.js - 列表渲染篇【南大软院大神养成计划】
- 使用jenkins自动化构建android和ios应用
- CentOS6.5下二进制多实例安装mysql-5.6.27
- try-catch-finally中return的执行情况