HDU 1269 迷宫城堡(强连通分量)
2015-08-30 12:06
363 查看
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
Solution
建完图后用tarjan算法求出强连通分量,然后判断是否所有点都在第一个连通块中即可
Code
为了训练小希的方向感,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
Solution
建完图后用tarjan算法求出强连通分量,然后判断是否所有点都在第一个连通块中即可
Code
#include<cstdio> #include<cstring> #include<iostream> #include<cmath> #include<algorithm> #include<stack> #include<vector> using namespace std; #define maxn 11111 vector<int>g[maxn]; stack<int>st; int n,m,scc,index; int low[maxn],dfn[maxn],instack[maxn],fa[maxn]; void init()//初始化 { scc=index=0; while(!st.empty())st.pop(); for(int i=0;i<maxn;i++)g[i].clear(); memset(dfn,0,sizeof(dfn)); memset(instack,0,sizeof(instack)); memset(low,0,sizeof(low)); } void tarjan(int u)//求强联通分量 { dfn[u]=low[u]=++index; instack[u]=1; st.push(u); int v,size=g[u].size(); for(int i=0;i<size;i++) { v=g[u][i]; if(!dfn[v]) { tarjan(v); low[u]=min(low[u],low[v]); } else if(instack[v]) low[u]=min(low[u],dfn[v]); } if(dfn[u]==low[u]) { scc++; do { v=st.top(); st.pop(); fa[v]=scc; instack[v]=0; }while(v!=u); } } bool check() { for(int i=0;i<n;i++)//求强连通分量 if(!dfn[i]) tarjan(i); for(int i=0;i<n;i++)//判断是否所有点都在第一个连通块中 if(fa[i]!=1) return false; return true; } int main() { while(scanf("%d%d",&n,&m),n||m) { init();//初始化 for(int i=0;i<m;i++) { int u,v; scanf("%d%d",&u,&v); g[u-1].push_back(v-1);//建图 } if(check()) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- [Java] HashMap 源码简要分析
- [Java] Hashtable 源码简要分析
- 仿京东listview刷新动画
- 初步06-正差值
- selenium +python+eclipse+pydev环境搭建
- (原生js)点击body隐藏div,但若点击的是指定的位置则不隐藏
- [Java] LinkedHashMap 源码简要分析
- 剖析安卓build系统的设计思想以及案例模拟
- 详解C语言中的fopen()函数和fdopen()函数
- 【英语】Bingo口语笔记(61) - mind系列
- 内置对象详解
- POJ 3009 深搜
- Leetcode|Longest Palindromic Substring(最长回文的几种方法)(Manacher算法)
- 下载个东西都要分数
- HDU 5401(计数dp)
- 百度地图SDK for android marker不随地图的移动而移动(仿滴滴打车)
- multiprocessing在python中的高级应用-IPC 之 Queue
- scala 18 文件读写
- Java记录 -17- static与final关键字
- 初识软考之Java环境配置