您的位置:首页 > 其它

hdu 1875 畅通工程再续(最小生成树Kruskal)

2010-09-16 14:38 459 查看
/*
Author: ACb0y
Date: 2010年9月16日12:09:35
Type: MST Kruskal
ProblemId: hdu 1875 畅通工程再续
Result: 2960804 2010-09-16 12:10:08 Accepted 1875 312MS 496K 1715 B C++ ACb0y
*/
#include <iostream>
#include <cmath>
using namespace std;
#define inf 999999999.9

struct Point {
double x;
double y;
};

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

int n;
int father[110];
Point points[110];
double g[110][110];
edge edges[10100];

double get_dis(int a, int b)
{
return sqrt((points[a].x - points[b].x) * (points[a].x - points[b].x) +
(points[a].y - points[b].y) * (points[a].y - points[b].y));
}

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 n) {
int i, j;
for (i = 1; i <= n; i++) {
father[i] = i;
}
int c = 0;
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
edges[c].w = g[i][j];
edges[c].x = i;
edges[c].y = j;
c++;
}
}
double ans = 0;
int flag = 1;
qsort(edges, c, sizeof(edge), cmp);
for (i = 0; i < c; i++) {
int x = find(edges[i].x);
int y = find(edges[i].y);
if (x != y) {
if (edges[i].w == inf) {
flag = 0;
break;
}
ans += edges[i].w;
father[x] = y;
}
}
if (flag) {
printf("%.1lf/n", ans * 100);
} else {
printf("oh!/n");
}
}

int main() {
int t;
int i, j;
#ifndef ONLINE_JUDGE
freopen("1875.txt", "r", stdin);
#endif
cin >> n;
while (n--) {
cin >> t;
for (i = 1; i <= t; i++) {
scanf("%lf%lf", &points[i].x, &points[i].y);
}
for (i = 1; i <= t; i++) {
for (j = 1; j <= t; j++) {
double temp = get_dis(i, j);
if (temp >= 10.0 && temp <= 1000.0) {
g[i][j] = temp;
} else {
g[i][j] = inf;
}
}
}
MST_Kruskal(t);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struct c 2010