1. 程式人生 > >POJ 1251

POJ 1251

cmp 一個 大小 def ace ++ find LG iostream

題目鏈接 http://poj.org/problem?id=1251

  本題主要是來求解最小生成樹。

  通過並查集來對每一個節點進行存取。(此時節點已經排序根據權值大小)

以下是代碼

 1 #include<iostream>
 2 #include<vector>
 3 #include<algorithm>
 4 #define MAX_N 150
 5 using namespace std;
 6 int pre[MAX_N];
 7 int n;
 8 char c[MAX_N],c1[MAX_N];
 9 int finds(int x)
10 {
11 return x==pre[x]?x:finds(pre[x]); 12 } 13 void unions(int x, int y) 14 { 15 int find_x=finds(x); 16 int find_y=finds(y); 17 if(find_x==find_y) 18 return; 19 pre[find_x]=find_y; 20 } 21 bool Judge(int x, int y) 22 { 23 return finds(x)==finds(y); 24 } 25 struct Pit 26
{ 27 int l,r,w; 28 } p; 29 vector<Pit> V; 30 bool cmp(Pit p1,Pit p2) 31 { 32 return p1.w<p2.w; 33 } 34 int main() 35 { 36 while(cin>>n) 37 { 38 V.clear(); 39 if(n==0) break; 40 for(int i=0; i<n; i++) 41 { 42 pre[i]=i; 43 }
44 for(int i=0; i<n-1; i++) 45 { 46 int a; 47 cin>>c>>a; 48 for(int i=0; i<a; i++) 49 { 50 int b; 51 cin>>c1>>b; 52 p.l=c[0]-A; 53 p.r=c1[0]-A; 54 p.w=b; 55 V.push_back(p); 56 } 57 } 58 int ans=0; 59 sort(V.begin(),V.end(),cmp); 60 for(int i=0; i<V.size(); i++) 61 { 62 if(Judge(V[i].l,V[i].r)) 63 continue; 64 ans+=V[i].w; 65 unions(V[i].l,V[i].r); 66 } 67 cout<<ans<<endl; 68 } 69 70 }

POJ 1251