暢通工程:並查集入門
阿新 • • 發佈:2019-03-04
mes cin 遞歸實現 .cn algorithm sample courier 分別是 ios
註意:兩個城市之間可以有多條道路相通,也就是說
3 3
1 2
1 2
2 1
這種輸入也是合法的
當N為0時,輸入結束,該用例不被處理。
暢通工程
Problem Description
某省調查城鎮交通狀況,得到現有城鎮道路統計表,表中列出了每條道路直接連通的城鎮。省政府“暢通工程”的目標是使全省任何兩個城鎮間都可以實現交通 (但不一定有直接的道路相連,只要互相間接通過道路可達即可)。問最少還需要建設多少條道路?Input
測試輸入包含若幹測試用例。每個測試用例的第1行給出兩個正整數,分別是城鎮數目N ( < 1000 )和道路數目M; 隨後的M行對應M條道路,每行給出一對正整數,分別是該條道路直接連通的兩個城鎮的編號。為簡單起見,城鎮從1到N編號。註意:兩個城市之間可以有多條道路相通,也就是說
1 2
1 2
2 1
這種輸入也是合法的
當N為0時,輸入結束,該用例不被處理。
Output
對每個測試用例,在1行裏輸出最少還需要建設的道路數目。Sample Input
4 2 1 3 4 3 3 3 1 2 1 3 2 3 5 2 1 2 3 5 999 0 0Sample Output
1 0 2 998題解:最簡答的並查集了,這算是我的並查集入門題。
#include<iostream> #include<algorithm> using namespace std; int fa[10010]; int cha(int a) { if (fa[a] != a)fa[a] = cha(fa[a]); //遞歸實現,路徑壓縮 return fa[a]; } void bing(int a, int b) { a = cha(a); b = cha(b); fa[a] = b; //a的師傅是b } int main() { //江湖開始:n個城市,相當於n個門派,兩個城市相連,記為a的師傅為b int n, m,ans=0,a,b; while (cin >> n&&n) { ans = 0; cin >> m; if (m == 0)cout << n - 1 << "\n"; else if (m == 1)cout << n - 2 << "\n"; else { for (int i = 1; i <= n; i++) //初始化,假定每個人師傅就是自己 fa[i] = i; for (int i = 1; i <= m; i++) { cin >> a >> b; bing(a, b); } for (int i = 1; i <= n; i++) if (fa[i]==i)ans++; //師傅是自己的,說明是一個門派 cout << ans-1 << "\n"; } } return 0; }
暢通工程:並查集入門