Kruskal的题,首先计算边,然后排序遍历。
中途由于格式错误PE了,改了一下。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
#define LLEN 105
#define SSIZE 10010
typedef struct Point {
double x, y;
}Point;
Point point[LLEN];
typedef struct Edge {
int u, v;
double w;
}Edge;
Edge e[SSIZE];
int p[LLEN];
bool cmp(Edge a, Edge b) {
return a.w < b.w;
}
double dis(int i, int j) {
double xx = abs(point[i].x - point[j].x);
double yy = abs(point[i].y - point[j].y);
double ans = xx*xx + yy*yy;
ans = sqrt(ans);
return ans;
}
void init(int n) {
for(int i = 0; i < n; i++) {
p[i] = i;
}
}
int find(int x) {
return p[x] == x ? x : (p[x] = find(p[x]));
}
double kruskal(int n, int num) {
double ans = 0;
for(int i = 0; i < num; i++) {
int t1 = find(e[i].u);
int t2 = find(e[i].v);
if(t1 != t2) {
p[t1] = t2;
ans += e[i].w;
}
}
return ans;
}
int main() {
int n;
int cse = 1;
while(scanf("%d", &n), n != 0) {
for(int i = 0; i < n; i++) {
scanf("%lf%lf", &point[i].x, &point[i].y);
}
int num = 0;
for(int i = 0; i < n; i++) {
for(int j = i+1; j < n; j++, num++) {
double ans = dis(i, j);
e[num].u = i;
e[num].v = j;
e[num].w = ans;
}
}
init(n);
sort(e, e+num, cmp);
double ans = kruskal(n, num);
if(cse > 1) printf("\n");
printf("Case #%d:\n", cse++);
printf("The minimal distance is: %.2lf\n", ans);
}
return 0;
}