0
点赞
收藏
分享

微信扫一扫

2021“MINIEYE杯”中国大学生算法设计超级联赛(8)- 1004(Ink on paper)

补题:​​https://acm.hdu.edu.cn/showproblem.php?pid=7058​​

每两个点之间连边,构建一个完全图,权值为两点之间的距离,跑一边prim算法,找到最小生成树边中最大的边输出即可!!!

​code​

#include <iostream>
#include <cstring>
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;
}


举报

相关推荐

0 条评论