就当恢复手感了,最近刷刷图论。。。人弱不拆...
刚开始路径压缩那里有个小bug,已经注释了
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxe = 220, maxv = 30;
typedef struct Edge {
int fr, to, wt;
}Edge;
Edge edge[maxe];
bool cmp(int i, int j)
{
return edge[i].wt < edge[j].wt;
}
int p[maxv];
int find(int x) {return (p[x] == x) ? x : p[x] = find(p[x]);}
int main()
{
int n;
while(~scanf("%d", &n) && n) {
int ecnt = 0, od[maxe];
for(int i = 0; i < n-1; i++) {
char s0[2], c0;
int num;
scanf("%s", s0);
c0 = s0[0];
scanf("%d", &num);
for(int j = 0; j < num; j++) {
char s1[2], c1;
int val;
scanf("%s", s1);
c1 = s1[0];
scanf("%d", &val);
edge[ecnt].fr = c0-'A';
edge[ecnt].to = c1-'A';
edge[ecnt].wt = val;
ecnt++;
}
}
for(int i = 0; i < ecnt; i++) od[i] = i;
for(int i = 0; i < n; i++) p[i] = i;
sort(od, od+ecnt, cmp);
// for(int i = 0; i < ecnt; i++) printf("%d\n", edge[od[i]].wt);
int ans = 0, tcnt = 0;
for(int i = 0; i < ecnt; i++) {
int cur = od[i];
int fr = edge[cur].fr, to = edge[cur].to, wt = edge[cur].wt;
if(find(fr) != find(to)) {
p[find(fr)] = find(to);//这里之前没有加 find,是对带路径压缩的并查集理解不够,可以加小优化把 find() 的结果暂存,避免重复调用
ans += wt;
tcnt++;
if(tcnt == n-1)
break;
}
}
printf("%d\n", ans);
}
return 0;
}