朴素的prim,还是自己写的用着习惯
pku 1251
#include<stdio.h>
#include
<string.h>
#define N 30
#define M 1<<27
int g[N][N],n; //g[][]的初值为M, 下标从0开始
int prim()
{
    
int i,j,k,ans=0;
    
int dis[N], visit[N], pre[N];
    
for(i=0; i<n; i++){
        dis[i]
=g[0][i];
        visit[i]
=0;
        pre[i]
=0;
    }
    visit[
0]=1;
    
for(i=1; i<n; i++){
        
int mn=M, v=0;
        
for(j=0; j<n; j++)
            
if(!visit[j] && dis[j]<mn){
                mn
=dis[j];
                v
=j;
            }
        
if(v==0break;
        visit[v]
=1;
        ans
+=mn;
        
for(j=0; j<n; j++)
            
if(!visit[j] && dis[j]>g[v][j]){
                dis[j]
=g[v][j];
                pre[j]
=v;
            }
    }
    
return ans;
}
int main()
{
    
int i,j,k,p,q,z;
    
char s[5];
    
while(scanf("%d"&n) && n){
        
for(i=0; i<n; i++)
            
for(j=0; j<n; j++)
                g[i][j]
=M;
        
for(i=0; i<n-1; i++){
            scanf(
"%s %d", s, &k);
            p
=s[0]-'A';
            
for(j=0; j<k; j++){
                scanf(
"%s %d", s, &z);
                q
=s[0]-'A';
                g[p][q]
=g[q][p]=z;
            }
        }
        printf(
"%d\n", prim());

    }
    
return 0;
}