/*******************************************************************/ |1251 Accepted 232K 16MS C++ 1285B 2011-06-10 17:35:29 /*******************************************************************/ #include<iostream> #include<algorithm> using namespace std; #define MAX 27 typedef struct { int x, y; int w; }edge; edge e[MAX * MAX]; /* rank[x]表示x的秩 */ int rank[MAX]; /* father[x]表示x的父节点 */ int father[MAX]; int sum; /* 比较函数,按权值非降序排序 */ bool cmp(const edge a, const edge b) { return a.w < b.w; } /* 初始化集合 */ void makeSet(int n) { for(int i=0; i<=n; i++) { father[i] = i; rank[i] = 0; } } /* 查找x元素所在的集合,回溯时压缩路径 */ int findSet(int x) { if (x != father[x]) { father[x] = findSet(father[x]); } return father[x]; } /* 合并x,y所在的集合 */ void unionSet(int x, int y, int w) { if (x == y) return; if (rank[x] > rank[y]) { father[y] = x; } else { if (rank[x] == rank[y]) { rank[y]++; } father[x] = y; } sum += w; } int main() { int i, j, k, m, n, t; char ch; while(cin >> m && m != 0) { k = 0; makeSet(m); for (i = 0; i < m - 1; i++) { cin >> ch >> n; for (j = 0; j < n; j++) { cin >> ch >> e[k].w; e[k].x = i; e[k].y = ch - 'A'; k++; } } sort(e, e + k, cmp); sum = 0; for (i = 0; i < k; i++) { unionSet(findSet(e[i].x), findSet(e[i].y), e[i].w); } cout << sum << endl; } return 0; }