样例过不去求助
查看原帖
样例过不去求助
902195
appIe365楼主2023/1/3 12:09

rt,并查集+floyd

#include<bits/stdc++.h>
using namespace std;
const int N = 155,M = N*N;
int n;
struct node{
    int x,y;
}a[N];
double get_dis(int x,int y){
    node p1 = a[x],p2 = a[y];
    double k = (double)(p1.x-p2.x)*(p1.x-p2.x) + (double)(p1.y-p2.y)*(p1.y-p2.y);
    return sqrt(k);
}
double g[N][N],far[N],o[N];
void floyd(){
    for(int k = 1;k <= n;k ++)
        for(int i = 1;i <= n;i ++)
            for(int j = 1;j <= n;j ++)
                g[i][j] = max(g[i][j],g[i][k]+g[k][j]);
    return ;
}
int fa[N];
int find(int x){
    if(fa[x] == x || fa[x] == 0)
        return fa[x] = x;
    return fa[x] = find(fa[x]);
}
void merge(int x,int y){
    int fx = find(x),fy = find(y);
    if(fx != fy) fa[fx] = fy;
    return ;
}
void get_far(){
    for(int i = 1;i <= n;i ++){
        for(int j = 1;j <= n;j ++)
            if(find(i) == find(j)) far[i] = max(far[i],g[i][j]);
        o[find(i)] = max(o[find(i)],far[i]);
    }
    return ;
}
signed main(){
    cin >> n;
    for(int i = 1;i <= n;i ++)
        cin >> a[i].x >> a[i].y;
    for(int i = 1;i <= n;i ++)
        for(int j = 1;j <= n;j ++){
            char c;
            cin >> c;
            if(i == j) g[i][j] = 0;
            else if(c == '0') g[i][j] = 1 << 30;
            else{
                g[i][j] = get_dis(i,j);    
                merge(i,j);
            }
        }
    floyd();
    get_far();
    double ans = 1 << 30;
    for(int i = 1;i <= n;i ++)
        for(int j = i+1;j <= n;j ++)
            if(find(i) != find(j))
                ans = min(ans,
                max(
                    far[i]+far[j]+get_dis(i,j),
                    max(o[find(i)],o[find(j)]))
                );
    printf("%.6f",ans);
    return 0;
}
2023/1/3 12:09
加载中...