rt,邻接矩阵和链式前向星都 MLE。
//链式前向星
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int n;
const int N = 5010;
double x[N], y[N];
double g[N][N];
int e[N * (N - 1) / 2], ne[N * (N - 1) / 2], h[N], idx = 1;
double w[N * (N - 1) / 2];
void add(int u, int v, double p) {
e[idx] = v, ne[idx] = h[u], w[idx] = p, h[u] = idx++;
}
double dis[N]; int vis[N];
double prim() {
for (int i = 1; i <= n; i++) dis[i] = 1e9;
double res = 0;
for (int i = 1; i <= n; i++) {
double mint = 1e9; int minid = -1;
for (int j = 1; j <= n; j++) {
if((minid == -1 || mint > dis[j]) && vis[j] == 0) {
mint = dis[j];
minid = j;
}
}
if(i != 1 && dis[minid] == 1e9) return -1;
if(i != 1) res += mint;
vis[minid] = 1;
for(int j = h[minid]; j; j = ne[j]) {
int to = e[j];
if(dis[to] > w[j]) dis[to] = w[j];
}
}
return res;
}
int main() {
ios::sync_with_stdio(false);
cin >> n;
for (int i = 1; i <= n; i++) cin >> x[i] >> y[i];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if(i != j) {
add(i, j, sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j])));
}
}
}
printf("%.2lf", prim());
return 0;
}
//邻接矩阵
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int n;
const int N = 5010;
double x[N], y[N];
double g[N][N];
double dis[N]; int vis[N];
double prim() {
for (int i = 1; i <= n; i++) dis[i] = 1e9;
double res = 0;
for (int i = 1; i <= n; i++) {
double mint = 1e9; int minid = -1;
for (int j = 1; j <= n; j++) {
if((minid == -1 || mint > dis[j]) && vis[j] == 0) {
mint = dis[j];
minid = j;
}
}
if(i != 1 && dis[minid] == 1e9) return -1;
if(i != 1) res += mint;
vis[minid] = 1;
for (int j = 1; j <= n; j++) {
dis[j] = min(dis[j], g[minid][j]);
}
}
return res;
}
int main() {
ios::sync_with_stdio(false);
cin >> n;
for (int i = 1; i <= n; i++) cin >> x[i] >> y[i];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if(i != j) {
g[i][j] = sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
}
}
}
printf("%.2lf", prim());
return 0;
}