/* Author: ACb0y Date: 2010年9月16日11:04:42 Type: MST kruskal ProblemId: hdu 1301 Jungle Roads Result: 2960607 2010-09-16 11:04:37 Accepted 1301 0MS 260K 1261 B C++ ACb0y */ #include <iostream> using namespace std; #define inf 999999999 int n, q; int g[30][30]; int father[30]; struct edge { int x, y; int w; }; edge edges[900]; int find(int x) { if (x != father[x]) { return find(father[x]); } return x; } int cmp(const void * a, const void * b) { edge * pa = (edge *) a; edge * pb = (edge *) b; return pa->w > pb->w ? 1 : -1; } void MST_Kruskal() { int i, j; for (i = 1; i <= n; i++) { father[i] = i; } int c = 0; for (i = 1; i <= n; i++) { for (j = i + 1; j <= n; j++) { edges[c].w = g[i][j]; edges[c].x = i; edges[c].y = j; c++; } } qsort(edges, c, sizeof(edge), cmp); int ans = 0; for (i = 0; i < c; i++) { int x = find(edges[i].x); int y = find(edges[i].y); if (x != y) { ans += edges[i].w; father[x] = y; } } cout << ans << endl; } int main() { int i, j; #ifndef ONLINE_JUDGE freopen("1301.txt", "r", stdin); #endif while (cin >> n) { if (n == 0) break; for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { g[i][j] = inf; } } for (i = 1; i < n; i++) { char a; cin >> a; int t; cin >> t; for (j = 1; j <= t; j++) { int temp; cin >> a >> temp; int k = a - 'A' + 1; g[i][k] = g[k][i] = temp; } } MST_Kruskal(); } return 0; }