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 }