// recently followed kuangbin Gangster crazy water problem (ORZ)
// Prime minimum spanning tree algorithm #include <the iostream> #include <cstdio> #include <CString> #define INF (0x3f3f3f3f) the using namespace STD; const int MAXN = 35; int Grape [MAXN] [MAXN], D [ MAXN]; BOOL VIS [MAXN]; int n-; // number of nodes int pre [MAXN]; int Prime () { Memset (D, INF, the sizeof (D)); Memset (pre, -1, the sizeof (pre )); D [0] = 0; the while (to true) { int minCost = INF, U = -1; for (int = 0 V; = n-V;! V ++) { ! IF (VIS [V] && D [v] <mincost) // d [v] <inf then prove side reaches V { minCost = D [V]; U = V; } } if(mincost==inf) break; vis[u] = true;//用 u 节点更新 相邻节点 for(int v=0;v!=n;++v) { if(Grape[u][v]!=-1&&!vis[v]&&Grape[u][v]<d[v]) { d[v] = Grape[u][v]; pre[v] = u; } } } int sum = 0; for(int v=0;v!=n;++v) if(pre[v]!=-1) sum += Grape[v][pre[v]]; return sum; } int main() { while(cin>>n&&n) { memset(Grape,-1,sizeof(Grape));// u ~ v -1表示 不存在边 memset(vis,false,sizeof(vis)); char u,v; int num,weight,sum = 0;//权值 for(int i=0;i!=n-1;++i) { cin>>u>>num; while(num--) { cin>>v>>weight; Grape[u-'A'][v-'A'] = Grape[v-'A'][u-'A'] = weight; sum += weight; } }//建图 cout<<Prime()<<endl; } }