您的位置:首页 > 其它

hdu 1301 Jungle Roads(最小生成树Kruskal)

2010-09-16 11:13 357 查看
/*
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struct c 2010