迷宫城堡
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7097 Accepted Submission(s): 3159Problem 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 0Sample Output
Yes
No
Accepted Code:
1 /************************************************************************* 2 > File Name: hdu_1269.cpp 3 > Author: Stomach_ache 4 > Mail: [email protected] 5 > Created Time: 2014年08月06日 星期三 16时26分46秒 6 > Propose: hdu 1269 7 ************************************************************************/ 8 9 //强连通模板题 10 #include <cmath> 11 #include <string> 12 #include <cstdio> 13 #include <vector> 14 #include <fstream> 15 #include <cstring> 16 #include <iostream> 17 #include <algorithm> 18 using namespace std; 19 20 const int maxn = 10002; 21 22 struct SCC { 23 vector<int> G[maxn]; 24 vector<int> rG[maxn]; 25 vector<int> vs; 26 bool used[maxn]; 27 int cmp[maxn]; 28 int n, m; 29 30 void init(int n) { 31 this->n = n; 32 for (int i = 0; i < n; i++) { 33 G[i].clear(); 34 rG[i].clear(); 35 } 36 vs.clear(); 37 } 38 void AddEdge(int from, int to) { 39 G[from].push_back(to); 40 rG[to].push_back(from); 41 } 42 void dfs(int u) { 43 used[u] = true; 44 for (int i = 0; i < (int)G[u].size(); i++) { 45 if (!used[G[u][i]]) dfs(G[u][i]); 46 } 47 vs.push_back(u); 48 } 49 void rdfs(int u, int k) { 50 cmp[u] = k; 51 used[u] = true; 52 for (int i = 0; i < (int)rG[u].size(); i++) { 53 if (!used[rG[u][i]]) rdfs(rG[u][i], k); 54 } 55 } 56 int find_scc() { 57 memset(used, false, sizeof(used)); 58 for (int i = 0; i < n; i++) { 59 if (!used[i]) dfs(i); 60 } 61 memset(used, false, sizeof(used)); 62 int k = 0; 63 for (int i = (int)vs.size()-1; i >= 0; i--) { 64 if (!used[vs[i]]) rdfs(vs[i], k++); 65 } 66 return k; 67 } 68 }; 69 70 SCC A; 71 72 int main(void) { 73 int n, m; 74 while (~scanf("%d %d", &n, &m) && (n || m)) { 75 A.init(n); 76 while (m--) { 77 int a, b; 78 scanf("%d %d", &a, &b); 79 a--; b--; 80 A.AddEdge(a, b); 81 } 82 int k = A.find_scc(); 83 if (k == 1) puts("Yes"); 84 else puts("No"); 85 } 86 87 return 0; 88 }
Hdu 1269 强连通判定
时间: 2024-11-05 21:47:28