日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

小希的迷宫 HDU - 1272 (并查集)

發布時間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 小希的迷宫 HDU - 1272 (并查集) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

思路: 當圖中的集合(連通子圖)個數為1并且邊數等于頂點數-1(即改圖恰好為一棵生成樹)時,輸出Yes.

此題的坑:(1) 如果只輸入0 0算作一組數據的話答案應該輸出Yes

     (2) 輸入數據可能并不是連通圖,有可能一開始不連通,所以最后一定要判斷其連通子圖個數是不是1

1 #include<iostream> 2 #include<vector> 3 #include<string> 4 #include<cmath> 5 #include<set> 6 #include<algorithm> 7 #include<cstdio> 8 #include<map> 9 #include<cstring> 10 11 using namespace std; 12 13 int Tree[100100]; 14 15 int findRoot(int x) 16 { 17 if(Tree[x] == -1) 18 return x; 19 int tmp = findRoot(Tree[x]); 20 Tree[x] = tmp; 21 return tmp; 22 } 23 24 int main() 25 { 26 int a, b; 27 set<int> Set; // 使用Set保存圖中的所有頂點編號 28 for(int i = 0; i <= 100000; ++i) 29 Tree[i] = -1; 30 31 int rimCnt = 0; 32 while(cin >> a >> b) 33 { 34 if(a == -1 && b == -1) 35 break; 36 37 if(a == 0 && b == 0) 38 { 39 if(rimCnt == 0) // 只有輸入一組數據0 0的時候,應該輸出Yes 40 { 41 cout << "Yes" << endl; 42 continue; 43 } 44 int Vcnt = Set.size(); // 頂點計數 45 int Scnt = 0; // 圖中的連通子圖(集合)個數 46 for(set<int>::iterator iter = Set.begin(); iter != Set.end(); ++iter) 47 { 48 if(Tree[*iter] == -1) 49 { 50 Scnt++; 51 } 52 } 53 54 // 當圖中的集合只有一個并且總邊數等于頂點數-1的時候,輸出Yes 55 if(Scnt == 1 && rimCnt == Vcnt - 1) 56 { 57 cout << "Yes" << endl; 58 } 59 else 60 { 61 cout << "No" << endl; 62 } 63 64 for(int i = 0; i <= 100000; ++i) 65 Tree[i] = -1; 66 Set.clear(); // 清空集合 67 rimCnt = 0; // 邊數置零 68 continue; 69 } 70 else 71 { 72 rimCnt++; // 邊計數 73 Set.insert(a); 74 Set.insert(b); 75 int ra = findRoot(a); 76 int rb = findRoot(b); 77 if(ra != rb) 78 { 79 Tree[ra] = rb; 80 } 81 } 82 83 } 84 85 return 0; 86 }

?

轉載于:https://www.cnblogs.com/FengZeng666/p/11398225.html

總結

以上是生活随笔為你收集整理的小希的迷宫 HDU - 1272 (并查集)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。