1. 程式人生 > >ACM 還是暢通工程

ACM 還是暢通工程

數據 () while cnblogs 結束 != 暢通工程 ble recommend

Problem Description 某省調查鄉村交通狀況,得到的統計表中列出了任意兩村莊間的距離。省政府“暢通工程”的目標是使全省任何兩個村莊間都可以實現公路交通(但不一定有直接的公路相連,只要能間接通過公路可達即可),並要求鋪設的公路總長度為最小。請計算最小的公路總長度。

Input 測試輸入包含若幹測試用例。每個測試用例的第1行給出村莊數目N ( < 100 );隨後的N(N-1)/2行對應村莊間的距離,每行給出一對正整數,分別是兩個村莊的編號,以及此兩村莊間的距離。為簡單起見,村莊從1到N編號。
當N為0時,輸入結束,該用例不被處理。

Output 對每個測試用例,在1行裏輸出最小的公路總長度。

Sample Input 3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0

Sample Output 3 5 Hint Hint Huge input, scanf is recommended. 題解:會用並查集就可以AC 沒有坑!!!!
 1 /*
 2     Time: 2017/8/8
 3     Author: WTZPT
 4 */
 5 #include<iostream>
 6 #include<cstring>
 7 #include<algorithm>
 8
using namespace std; 9 int parent[105]; 10 11 struct node{ //定義一個結構體,方便數據收集 12 int a,b,s; //a,b是兩個村莊的編號 s是兩個村莊的距離 13 }caseii[5005]; 14 15 void init() //初始化parent數組 16 { 17 for(int i = 0; i < 105; i++) 18 parent[i] = i; 19 } 20 21 bool cmp(node a,node b) //定義sort排序方式 22 {
23 return a.s < b.s; 24 } 25 26 int find(int n) //找根值 27 { 28 if(parent[n] == n) 29 return n; 30 else 31 return find(parent[n]); 32 } 33 34 int merge(int a,int b) 35 { 36 a = find(a); 37 b = find(b); 38 if(a != b) 39 { 40 parent[b] = a; 41 return 1; 42 } 43 return 0; 44 } 45 46 int main() 47 { 48 int n; 49 while(cin>>n&&n) 50 { 51 init(); 52 int t = n*(n-1)/2; 53 for(int i =0; i < t;i++) 54 cin>>caseii[i].a>>caseii[i].b>>caseii[i].s; 55 sort(caseii,caseii+t,cmp); 56 int sum = 0; 57 for(int i = 0; i < t;i++) 58 { 59 int temp = merge(caseii[i].a,caseii[i].b); 60 if(temp) sum += caseii[i].s; 61 } 62 63 cout<<sum<<endl; 64 } 65 66 return 0; 67 }

ACM 還是暢通工程