原题传送门
这题题面看起来就是在讲一个算法的流程,然后是求最小生成树,用
罕见的会爆内存,然而这题允许
的复杂度,就用传说中的
解决
Code:
#include <bits/stdc++.h>
#define maxn 5010
#define LL long long
using namespace std;
double x[maxn], y[maxn], dis[maxn], ans;
int n, vis[maxn];
inline int read(){
int s = 0, w = 1;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
return s * w;
}
double calc(int i, int j){ return sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j])); }
int main(){
n = read();
for (int i = 1; i <= n; ++i) x[i] = read(), y[i] = read();
for (int i = 2; i <= n; ++i) dis[i] = 1e9;
for (int i = 1; i <= n; ++i){
int p = -1;
for (int j = 1; j <= n; ++j)
if (!vis[j] && (p == -1 || dis[p] > dis[j])) p = j;
vis[p] = 1, ans += dis[p];
for (int j = 1; j <= n; ++j) dis[j] = min(dis[j], calc(p, j));
}
printf("%.2lf\n", ans);
return 0;
}