题目链接:http://poj.org/problem?id=1251
//双向图 //点的数量小,采用邻接矩阵 //最小生成树prim #include<iostream> #include<cstring> #include<iomanip> #define INF 100000 using namespace std; const int maxn=30; int dis[maxn]; bool vis[maxn]; int map[maxn][maxn]; int sum,m,b,n; char a,a1; void prim() { int temp; for(int i=1;i<=n;i++) { int cf=INF; for(int j=1;j<=n;j++) { if(!vis[j]&&dis[j]<cf) { temp=j; cf=dis[j]; } } if(cf==INF) cf=0; sum+=cf; vis[temp]=true; for(int j=1;j<=n;j++) if(!vis[j]&&map[temp][j]<dis[j]) dis[j]=map[temp][j]; } } int main (){ while(cin>>n&&n) { for(int i=0;i<30;i++) for(int j=0;j<30;j++) { map[i][j]=INF; vis[i]=false; } for(int i=2;i<=n;i++) { cin>>a>>m; while(m--) { cin>>a1>>b; map[a-65+1][a1-65+1]=map[a1-65+1][a-65+1]=b; } } for(int i=1;i<=n;i++) dis[i]=map[i][1]; vis[1]=true; sum=0; prim(); cout<<sum<<endl; } return 0; }