首页 > 代码库 > Hdu 1269 强连通判定

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 31 22 33 13 31 22 33 20 0

 

Sample Output
YesNo
 Accepted Code:
 1 /************************************************************************* 2     > File Name: hdu_1269.cpp 3     > Author: Stomach_ache 4     > Mail: sudaweitong@gmail.com 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 }