最小生成树 HDU1233
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 7 using namespace std; 8 9 int map[110][110]; 10 bool vis[110]; 11 int div1[110]; 12 int MAX=1<<29; 13 14 int main() 15 { 16 int n; 17 while(scanf("%d",&n)!=EOF) 18 { 19 if(n==0) 20 break; 21 int a,b,c; 22 int ans=0; 23 for(int i=1;i<=n;i++) 24 map[i][i]=0; 25 for(int i=1;i<=n*(n-1)/2;i++) 26 { 27 scanf("%d%d%d",&a,&b,&c); 28 map[a][b]=map[b][a]=c; 29 } 30 for(int i=1;i<=n;i++) 31 { 32 div1[i]=map[1][i]; 33 vis[i]=false; 34 } 35 div1[1]=0; 36 for(int i=1;i<=n;i++) 37 { 38 int mi=MAX; 39 int v; 40 for(int j=1;j<=n;j++) 41 { 42 if(!vis[j]&&div1[j]<mi) 43 { 44 mi=div1[j]; 45 v=j; 46 } 47 } 48 vis[v]=true; 49 ans+=mi; 50 for(int j=1;j<=n;j++) 51 { 52 if(!vis[j]&&div1[j]>map[v][j]) 53 { 54 div1[j]=map[v][j]; 55 } 56 } 57 } 58 cout<<ans<<endl; 59 } 60 return 0; 61 }