最小生成树(模板题)


A - Jungle Roads


 POJ - 1251 


1
#include <iostream> 2 #include <cstring> 3 #include <string> 4 #include <map> 5 #include <set> 6 #include <algorithm> 7 #include <fstream> 8 #include <cstdio> 9 #include <cmath> 10 #include <stack> 11 #include <queue> 12 #define mem(x) memset(x,0,sizeof(x)) 13 using namespace std; 14 typedef long long ll; 15 int n; 16 int G[MAXN][MAXN]; 17 void read(){ 18 mem(G); 19 for(int i=1;i<n;i++){ 20 int m;char c;cin>>c>>m; 21 for(int j=1;j<=m;j++){ 22 char a;int s; 23 cin>>a>>s; 24 G[(int)(a-'A')][(int)(c-'A')]=s; 25 G[(int)(c-'A')][(int)(a-'A')]=s; 26 } 27 } 28 } 29 ll prim(){ 30 int U[n+1]; 31 int cost[n+1]; 32 for(int i=0;i<=n;i++){ 33 U[i]=0; 34 } 35 for(int i=1;i<n;i++){ 36 if(G[0][i]) cost[i]=G[0][i]; 37 else cost[i]=INF; 38 } 39 U[0]=1; 40 for(int i=1;i<n;i++){ 41 int minn=INF;int k=-1; 42 for(int j=0;j<n;j++){ 43 if(U[j]) continue; 44 if(minn>cost[j]){ 45 minn=cost[j]; 46 k=j; 47 } 48 } 49 if(minn==INF) return -1; 50 U[k]=1; 51 for(int j=0;j<n;j++){ 52 if(U[j]) continue; 53 if(G[k][j]<cost[j]&&G[k][j]){ 54 cost[j]=G[k][j]; 55 } 56 } 57 } 58 ll sum=0; 59 for(int i=1;i<n;i++){ 60 sum+=cost[i]; 61 } 62 return sum; 63 } 64 int main(){ 65 while(cin>>n){ 66 if(n==0) break; 67 read(); 68 cout <<prim()<<endl; 69 } 70 return 0; 71 }

 

posted @ 2019-07-16 20:20  Chuhanjing  阅读(345)  评论(0编辑  收藏  举报