1. 程式人生 > >暢通工程(kruskal算法)

暢通工程(kruskal算法)

itl -- spa problem 簡單 算法 struct 不足 cin

個人心得:日了狗,WR了倆個小時才發現是少了個vector清理,我也是醉了,不過後面還是對這個有了更好得了解,一是我得算法,而是學長改進

後的算法,改進後得算法還要判斷所有村莊是否在連在一起,其實我覺得實必要性不大。

技術分享

省政府“暢通工程”的目標是使全省任何兩個村莊間都可以實現公路交通(但不一定有直接的公路相連,只要能間接通過公路可達即可)。經過調查評估,得到的統計表中列出了有可能建設公路的若幹條道路的成本。現請你編寫程序,計算出全省暢通需要的最低成本。

Input 測試輸入包含若幹測試用例。每個測試用例的第1行給出評估的道路條數 N、村莊數目M ( < 100 );隨後的 N
行對應村莊間道路的成本,每行給出一對正整數,分別是兩個村莊的編號,以及此兩村莊間道路的成本(也是正整數)。為簡單起見,村莊從1到M編號。當N為0時,全部輸入結束,相應的結果不要輸出。

Output 對每個測試用例,在1行裏輸出全省暢通需要的最低成本。若統計數據不足以保證暢通,則輸出“?”。

Sample Input 3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100

Sample Output 3 ?

Source 浙大計算機研究生復試上機考試-2007年
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<vector>
 5 #include<algorithm>
 6
using namespace std; 7 const long long maxa=99999999; 8 int n,m; 9 struct village 10 { 11 int v; 12 int e; 13 int w; 14 village(int x,int y,int z){ 15 v=x,e=y,w=z; 16 } 17 village(){} 18 bool operator <(const village &V)const 19 { 20 return
w<V.w; 21 22 } 23 24 }; 25 vector<village> V; 26 int book[105]; 27 void init() 28 { 29 for(int i=1;i<=m;i++) 30 book[i]=i; 31 32 } 33 int getx(int x) 34 { 35 if(book[x]!=x) 36 book[x]=getx(book[x]); 37 return book[x]; 38 } 39 void mergexy(int x,int y) 40 { 41 book[y]=x; 42 } 43 int main() 44 { 45 while(cin>>n>>m) 46 { 47 V.clear(); 48 if(n==0) break; 49 init(); 50 int t=n; 51 while(t--) 52 { 53 int x,y,z; 54 scanf("%d%d%d",&x,&y,&z); 55 village a(x,y,z); 56 V.push_back(a); 57 } 58 sort(V.begin(),V.end()); 59 int number=0; 60 long long sum=0; 61 for(int i=0;i<V.size();i++) 62 { 63 if(getx(V[i].v)!=getx(V[i].e)){ 64 mergexy(getx(V[i].v),getx(V[i].e)); 65 number++; 66 sum+=V[i].w; 67 68 } 69 if(number==m-1) break; 70 } 71 if(number==m-1) cout<<sum<<endl; 72 else cout<<"?"<<endl; 73 74 75 } 76 return 0; 77 }

暢通工程(kruskal算法)