Hdu 1269 强连通判定

题目链接

迷宫城堡

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7097    Accepted Submission(s): 3159


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
 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)