HDU Problem 1272 小希的迷宫 【并查集】
生活随笔
收集整理的這篇文章主要介紹了
HDU Problem 1272 小希的迷宫 【并查集】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
小希的迷宮
Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 43473????Accepted Submission(s): 13380
?
Input 輸入包含多組數據,每組數據是一個以0 0結尾的整數對列表,表示了一條通道連接的兩個房間的編號。房間的編號至少為1,且不超過100000。每兩組數據之間有一個空行。?整個文件以兩個-1結尾。
?
Output 對于輸入的每一組數據,輸出僅包括一行。如果該迷宮符合小希的思路,那么輸出"Yes",否則輸出"No"。?
Sample Input 6 8 5 3 5 2 6 4 5 6 0 0 8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0 3 8 6 8 6 4 5 3 5 6 5 2 0 0 -1 -1?
Sample Output Yes Yes No?
Author Gardon?
Source HDU 2006-4 Programming Contest?
Recommend lxj???|???We have carefully selected several similar problems for you:??1856?1325?1198?1875?1879? 題意比較簡單,就是給你一些點,問你這一點可不可以組成一棵樹。 比較坑的是給的點并不連續,還得自己判斷。 #include<cstdio> #define MAX_N 150000 using namespace std;int per[MAX_N]; bool flag; bool vis[MAX_N]; void init() {for(int i = 1;i < MAX_N; i++){per[i] = i;vis[i] = false;} } int Find(int x) {if(x == per[x]) return x;return per[x] = Find(per[x]); } void unite(int x, int y) {int fx = Find(x);int fy = Find(y);if(fx != fy) per[fy] = fx;else flag = false; } int main() {int m, a, b, n;while(scanf("%d%d", &n, &m) != EOF) {flag = true;if(n == -1 && m == -1) break;if(n == 0 && m == 0){printf("Yes\n"); continue;}int cut = 0; init();vis[n] = vis[m] = true; unite(n, m);while(scanf("%d%d", &a, &b), a&&b) {vis[a] = vis[b] = true;unite(a, b);}for(int i = 1;i < MAX_N; i++){if(i == per[i] && vis[i]){cut++;}if(cut > 1){flag = false; break;}}if(flag) printf("Yes\n");else printf("No\n");}return 0; }?
?
轉載于:https://www.cnblogs.com/cniwoq/p/6770882.html
總結
以上是生活随笔為你收集整理的HDU Problem 1272 小希的迷宫 【并查集】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一些常用的选择器
- 下一篇: MqSql的加锁分析