您的位置:首页 > 其它

hdu 1233 还是畅通工程(最小生成树Kruskal)

2010-09-16 01:26 716 查看
/*
Author: ACb0y
Date: 2010年9月16日1:24:18
Type: MST Kruskal
ProblemId: hdu 1233 还是畅通工程
Result: 2960115 2010-09-16 01:22:42 Accepted 1233 343MS 428K 1087 B G++ ACb0y
*/
#include <iostream>
using namespace std;

int n, q;
int g[110][110];
int father[110];

struct edge {
int x;
int y;
int w;
};

edge edges[10100];

int cmp(const void * a, const void * b) {
edge * pa = (edge *) a;
edge * pb = (edge *) b;
return pa->w > pb->w ? 1 : -1;
}

int find(int x) {
if (x != father[x]) {
return find(father[x]);
}
return x;
}

int main() {
int i, j;
#ifndef ONLINE_JUDGE
freopen("1233.txt, "r", stdin);
#endif
while (cin >> n) {
if (n == 0) break;
q = n * (n - 1) / 2;
for (i = 1; i <= q; i++) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
g[a][b] = g[b][a] = c;
}
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);
for (i = 1; i <= n; i++) {
father[i] = i;
}
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;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struct c 2010