题目链接:http://poj.org/problem?id=1251
Sample Input 9 A 2 B 12 I 25 B 3 C 10 H 40 I 8 C 2 D 18 G 55 D 1 E 44 E 2 F 60 G 38 F 0 G 1 H 35 H 1 I 35 3 A 2 B 10 C 40 B 1 C 20 0 Sample Output 216 30
分析:最小生成树模板题,注意将字母转化为数字ch-'A'+1,输入时%s%d,或者使用cin避免空格回车造成的影响
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stack> 6 #include<math.h> 7 #include<queue> 8 #include<map> 9 #include<time.h> 10 using namespace std; 11 12 #define INF 0x3f3f3f3f 13 #define N 153000 14 15 int maps[200][200],dist[50],vis[50],n; 16 17 void Init() 18 { 19 for(int i=1; i<=26; i++) 20 { 21 for(int j=1; j<=26; j++) 22 { 23 if(i==j) 24 maps[i][j]=0; 25 else 26 maps[i][j]=maps[j][i]=INF; 27 } 28 29 dist[i]=INF; 30 vis[i]=0; 31 } 32 } 33 34 int prim(int s) 35 { 36 int i,j; 37 38 vis[s]=1; 39 for(i=1;i<=26;i++) 40 dist[i]=maps[s][i]; 41 42 int sum=0; 43 for(i=1;i<n;i++) 44 { 45 int Min=INF,index=-1; 46 for(j=1;j<=26;j++) 47 if(!vis[j]&&Min>dist[j]) 48 { 49 Min=dist[j]; 50 index=j; 51 } 52 sum+=Min; 53 vis[index]=1; 54 55 for(j=1;j<=26;j++) 56 if(!vis[j]&&dist[j]>maps[index][j]) 57 dist[j]=maps[index][j]; 58 59 } 60 return sum; 61 } 62 63 int main() 64 { 65 int i,j,m,c,h1,h2; 66 char ch1,ch2; 67 68 while(scanf("%d", &n), n) 69 { 70 Init(); 71 for(i=1; i<n; i++) 72 { 73 cin>>ch1>>m; 74 h1=ch1-'A'+1; 75 for(j=1; j<=m; j++) 76 { 77 cin>>ch2>>c; 78 h2=ch2-'A'+1; 79 maps[h1][h2]=maps[h2][h1]=c; 80 ///printf("%d %d %d\n", h1,h2,maps[h1][h2]); 81 } 82 } 83 84 int ans=prim(1); 85 86 printf("%d\n", ans); 87 } 88 return 0; 89 }