http://acm.hdu.edu.cn/showproblem.php?pid=1301
#include<iostream> #include<cstdio> #include<cstring> #define INF 0xfffffff int map[28][28],f[133],n,vis[28],dis[28],min; void prim() { int i,j,k,ans=0; memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) dis[i]=map[1][i]; vis[1]=1; for(i=1;i<n;i++) { min=INF; for(j=1;j<=n;j++) if(!vis[j]&&dis[j]<min) { min=dis[j]; k=j; } vis[k]=1; ans+=min; for(j=1;j<=n;j++) if(!vis[j]&&dis[j]>map[k][j]) dis[j]=map[k][j]; } printf("%d\n",ans); } int main(void) { int i,j,m,d; char s,c; for(i='A';i<='Z';i++) f[i]=i-'A'+1; while(scanf("%d",&n),n) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) map[i][j]=INF; getchar(); for(i=1;i<n;i++) { scanf("%c%d",&s,&m); getchar(); while(m--) { scanf("%c%d",&c,&d); getchar(); map[f[s]][f[c]]=map[f[c]][f[s]]=d; } } prim(); } return 0; }