补题:https://acm.hdu.edu.cn/showproblem.php?pid=7058
每两个点之间连边,构建一个完全图,权值为两点之间的距离,跑一边prim算法,找到最小生成树边中最大的边输出即可!!!
code
using namespace std;
typedef long long ll;
const int N = 5005;
int n, x[N], y[N];
bool st[N];
ll dis[N], g[N][N];
void prim(){
ll res = 0;
dis[0] = 0;
for (int i = 0; i < n; ++i) {
int t = -1;
for (int j = 0; j < n; ++j) {
if(!st[j] && (t == -1 || dis[j] < dis[t])){
t = j;
}
}
st[t] = true;
if(i) res = max(res, dis[t]);
for (int j = 0; j < n; j++) {
dis[j] = min(dis[j], g[t][j]);
}
}
printf("%lld\n", res);
}
int main(){
int t;
scanf("%d", &t);
while (t--){
memset(dis, 0x3f, sizeof(dis));
memset(st, 0, sizeof(st));
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d%d", &x[i], &y[i]);
}
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
ll d1 = (x[i] - x[j]);
ll d2 = (y[i] - y[j]);
ll c = d1*d1 + d2*d2;
g[i][j] = c, g[j][i] = c;
}
}
prim();
}
return 0;
}