Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 6195 | Accepted: 3108 |
Description
Input
Output
Sample Input
3 1.0 1.0 2.0 2.0 2.0 4.0
Sample Output
3.41
Source
12045361 | wangwenhao | 2560 | Accepted | 296K | 0MS | C++ | 1671B | 2013-08-27 23:17:49 |
12045351 | wangwenhao | 2560 | Wrong Answer | G++ | 1717B | 2013-08-27 23:15:07 |
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <cmath> using namespace std; void kruscal(int edgeSize); const int maxn = 110; const int maxm = 51000; const double eps = 1e-8; int gn; struct point { double dx; double dy; }p[maxn]; struct edge { int x, y; double w; }e[maxm]; int f[maxn]; double dist(double x, double y) { return sqrt(x*x + y*y);//先不开方. } bool cmp(const edge& a, const edge& b) { return a.w < b.w; } void build() {//建图. int i, j; int index = 0; for(i = 1; i <= gn; i++) { for(j = 1; j <= gn; j++) { if(i == j) continue; else { e[index].x = i; e[index].y = j; e[index].w = dist(p[i].dx-p[j].dx, p[i].dy-p[j].dy); index++; } } } kruscal(index); } int getfather(int x) { if(x == f[x]) return x; else return f[x] = getfather(f[x]); } void kruscal(int edgeSize) { int i; sort(e, e+edgeSize, cmp); int cnt = gn; double ans = 0.0; for(i = 1; i <= gn; i++) f[i] = i; for(i = 0; i < edgeSize; i++) { int t1 = getfather(e[i].x); int t2 = getfather(e[i].y); if(t1 != t2) { f[t1] = t2; cnt--; ans += e[i].w; } if(cnt == 1) break; } printf("%.2lf\n", ans); } int main() { int i; while(scanf("%d", &gn) != EOF) { for(i = 1; i <= gn; i++) { scanf("%lf%lf", &p[i].dx, &p[i].dy); } build(); } return 0; }