杭电(1269)迷宫城堡(强联通之定义算法)
2015-10-19 21:53
363 查看
迷宫城堡
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10364 Accepted Submission(s): 4653
[align=left]Problem Description[/align]
为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间。Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间j到房间i。
[align=left]Input[/align]
输入包含多组数据,输入的第一行有两个数:N和M,接下来的M行每行有两个数a和b,表示了一条通道可以从A房间来到B房间。文件最后以两个0结束。
[align=left]Output[/align]
对于输入的每组数据,如果任意两个房间都是相互连接的,输出"Yes",否则输出"No"。
[align=left]Sample Input[/align]
3 3
1 2
2 3
3 1
3 3
1 2
2 3
3 2
0 0
[align=left]Sample Output[/align]
Yes
No
<pre name="code" class="cpp">#include<iostream> #include<vector> using namespace std; #define MAX 10005 vector<int>v[MAX]; //用vector创建邻接表 bool flag[MAX]; void DFS(int k) //深度优先搜索 { int i; flag[k]=true; for(i=0;i<v[k].size();i++) if(flag[v[k][i]]==false) DFS(v[k][i]); } int main() { int M,N; int a,b; int i,j; bool count; while(cin>>N>>M&&M||N) { count=true; for(i=0;i<M;i++) //邻接表的建立 { cin>>a>>b; v[a].push_back(b); } for(i=1;i<=N;i++) //以每个房间为顶点深度优先搜索 { for(j=1;j<=N;j++) flag[j]=false; DFS(i); for(j=1;j<=N;j++) if(flag[j]==false) { count=false; break; } if(count==false) break; } if(count) cout<<"Yes"<<endl; else cout<<"No"<<endl; for(i=1;i<=N;i++) //清空邻接表 v[i].clear(); } return 0; }
相关文章推荐
- Android 5.0(Lollipop)事件输入系统(Input System)
- Scrum敏捷开发
- urI转码
- java web(发送邮件,以及要整合的包)
- SSH框架搭建登录实例
- Linux多线程基础学习(五)线程同步-同步概念、互斥锁
- JSON详解
- qtxlsx将excel中的数据读取到widget上
- 关于UFT的一些小想法
- 缓存类型与自定义三级缓存
- 封装Libsvm与Liblinear(重要概念之返回预测类别的概率分数)
- 欢迎使用CSDN-markdown编辑器
- 26.Path Sum
- UVA11137
- 内连接 外连接 交叉连接
- mysql的数据类型,列类型,字段类型
- 集合(关于collection)
- Linux系统时间设置
- const int *p与int *const p的区别
- Oracle函数之LAG与LEAD