HDU 1269 迷宫城堡

来源:互联网 发布:传奇霸业宝石数据 编辑:程序博客网 时间:2024/05/21 10:38

迷宫城堡

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 19   Accepted Submission(s) : 8

Font: Times New Roman | Verdana | Georgia

Font Size:  

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
<pre name="code" class="cpp">#include<iostream>#include<stdio.h>#include<string.h>#include<string>#include<cmath>#include<queue>#include<stack>#include<vector>#include<algorithm>using namespace std;const int N = 10005;vector<int> adj[N], t_adj[N];bool visit[N];int n, m, cnt;bool dfs(int rt, vector<int> *graph){stack<int> st;st.push(rt);visit[rt] = true;cnt = 0;while (!st.empty()){int u = st.top();++cnt;st.pop();for (int i = 0; i < graph[u].size(); ++i){if (visit[graph[u][i]])continue;st.push(graph[u][i]);visit[graph[u][i]] = true;}}if (cnt == n)return true;return false;}void transform(){for (int i = 1; i <= n; ++i){for (unsigned j = 0; j < adj[i].size(); ++j){t_adj[adj[i][j]].push_back(i);}}}bool kosaraju(){memset(visit, 0, sizeof(visit));bool ret = dfs(1, adj);if (!ret)return false;transform();memset(visit, 0, sizeof(visit));ret = dfs(1, t_adj);if (ret)return true;return false;}int main(){int a, b;while (scanf("%d %d", &n, &m) != EOF && (m + n)){for (int i = 0; i < m; ++i){scanf("%d %d", &a, &b);adj[a].push_back(b);}if (kosaraju()){printf("Yes\n");}else{printf("No\n");}for (int i = 1; i <= n; ++i){adj[i].clear();t_adj[i].clear();}}return 0;}


0 0
原创粉丝点击