https://vjudge.net/problem/HDU-1272
题意:
上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路)。小希现在把她的设计图给你,让你帮忙判断她的设计图是否符合她的设计思路。
思路:
并查集。最后要判断是否成环。这很简单,不成环的条件就是顶点数=边数+1。
需要注意的是如果一开始直接输入两个0,是要输出Yes的。
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 5 const int maxn = 100000 + 5; 6 7 int p[maxn]; 8 int vis[maxn]; 9 10 int find(int x) 11 { 12 return p[x] == x ? x : find(p[x]); 13 } 14 15 void Unions(int x, int y) 16 { 17 p[x] = y; 18 } 19 20 int main() 21 { 22 freopen("D:\txt.txt", "r", stdin); 23 int a, b; 24 while (cin >> a >> b) 25 { 26 int cnt = 0, num = 0; 27 memset(vis, 0, sizeof(vis)); 28 if (a == -1 && b == -1) break; 29 if (a == 0 && b == 0) 30 { 31 cout << "Yes" << endl; 32 continue; 33 } 34 if (!vis[a]) 35 { 36 vis[a] = 1; 37 p[a] = a; 38 cnt++; 39 } 40 if (!vis[b]) 41 { 42 vis[b] = 1; 43 p[b] = b; 44 cnt++; 45 } 46 int x = find(a); 47 int y = find(b); 48 { 49 Unions(a, b); 50 } 51 num++; 52 while (cin >> a >> b) 53 { 54 if (a == 0 && b == 0) break; 55 if (!vis[a]) 56 { 57 vis[a] = 1; 58 p[a] = a; 59 cnt++; 60 } 61 if (!vis[b]) 62 { 63 vis[b] = 1; 64 p[b] = b; 65 cnt++; 66 } 67 int x = find(a); 68 int y = find(b); 69 { 70 Unions(a, b); 71 } 72 num++; 73 } 74 if (cnt == num + 1) cout << "Yes" << endl; 75 else cout << "No" << endl; 76 } 77 return 0; 78 }