D - Outlets HDU4463 最小生成树
NIKE和苹果店要在一起,所以将他们两个放在第一步联结确保相连。
#include<iostream> #include<algorithm> #include<cstdio> #include<iomanip> #include<cmath> #define inf 0x3f3f3f3f const int maxn = 1e5 + 10; using namespace std; int father[maxn]; int find(int x) { return father[x] == x ? x : father[x] = find(father[x]); } void unite(int x, int y) { father[find(x)] = find(y); } struct rec { int x, y; double z; bool friend operator<(const rec& a, const rec& b) { return a.z < b.z; } }e[maxn]; int main() { int t; while (scanf("%d", &t), t) { double x[110], y[110], z[110], r[110]; double dis[110][110]; for (int i = 1;i <= t;i++) { scanf("%lf %lf %lf %lf", &x[i], &y[i], &z[i], &r[i]); } int add = 1; for (int i = 1;i < t;i++) { for (int j = i + 1;j <= t;j++) { dis[i][j] = sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]) + (z[i] - z[j]) * (z[i] - z[j])) - r[i] - r[j]; e[add].x = i, e[add].y = j, e[add].z = dis[i][j]; add++; } } add--; for (int i = 1;i <= t;i++)father[i] = i; sort(e + 1, e + 1 + add); double ans = 0; for (int i = 1;i <= add;i++) { int fx = find(e[i].x), fy = find(e[i].y); if (fx == fy)continue; unite(fx, fy); if (e[i].z > 0) { ans += e[i].z; } } printf("%.3f\n", ans); } return 0; }

浙公网安备 33010602011771号