主要就是并查集(路径压缩)和间接排序的使用,练练手。
时候不早了,碎觉去~~~~~
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
#define MAXSIZE 100
struct EDGE {
int w; int u; int v;
void make(int start, int dest, int dist) {
u = start; v = dest;
w = dist;
}
}edge[MAXSIZE]; int ptr = 0;
int father[30];
int find(int x) {
if (father[x] == x) return x;
father[x] = find(father[x]);
return father[x];
}
struct cmp {
bool operator () (int a, int b) {
return edge[a].w > edge[b].w;
}
};
priority_queue<int,vector<int>,cmp> q;
int main() {
for (int i = 0; i < 30; i++) father[i] = i;
int n; scanf("%d",&n);
for (int i = 0; i < n - 1; i++) {
int u,v,w;
char c; int num; cin >> c >> num;
u = c - 'A';
for (int j = 0; j < num; j++) {
cin >> c >> w;
v = c - 'A';
edge[ptr].make(u,v,w);
q.push(ptr++);
}
} // end input
int cost = 0;
for (int cnt = 0; cnt < n - 1; cnt++) { // 最终选择n - 1条边
int index,fa_u,fa_v;
do {
index = q.top(); q.pop();
fa_u = find(edge[index].u);
fa_v = find(edge[index].v);
} while (fa_u == fa_v); // find
father[fa_v] = fa_u; // union
cost += edge[index].w;
}
printf("%d\n",cost);
return 0;
}