AcWing1125 牛的旅行(floyd)

2021-03-07 13:26

阅读:604

标签:wing   ret   a+b   style   name   因此   type   int   hide   

看得出题目的直径也就是任意两点之间最短路的最大值,因此这是个多源汇最短路

而连接两个独立的区域,就需要取到最小值,然后跟每个集合的最大值进行取max

技术图片技术图片
#include
#includestring>
#include
#include#define x first
#define y second
using namespace std;
typedef pairdouble,double> pll;
const int N=200;
const double inf=1e20;
double d[N][N];
double maxd[N];
string s[N];
int n;
pll q[N];
double get(int i,int j){
    double a=q[i].x-q[j].x;
    double b=q[i].y-q[j].y;
    return  sqrt(a*a+b*b);
}
int main(){
    cin>>n;
    int i;
    for(i=1;i){
        cin>>q[i].x>>q[i].y;
    }
    for(i=1;i){
        cin>>s[i];
    }
    int j;
    for (int i =1; i  )
        for (int j = 1; j  ){
            if(i==j) continue;
            if (s[i][j-1] == 1) d[i][j] = get(i, j);
            else d[i][j] = inf;
        }
            
    for(int k=1;k){
        for(i=1;i){
            for(j=1;j){
                d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
            }
        }
    }
    double r1=0;
    for(i=1;i){
        for(j=1;j){
            if(d[i][j]2)
            maxd[i]=max(maxd[i],d[i][j]);
        }
        r1=max(r1,maxd[i]);
    }
    double r2=inf;
    for(i=1;i){
        for(j=1;j){
            if(d[i][j]>inf/2){
                r2=min(r2,maxd[i]+maxd[j]+get(i,j));
            }
        }
    }
    printf("%.6f\n",max(r1,r2));
}
View Code

 

AcWing1125 牛的旅行(floyd)

标签:wing   ret   a+b   style   name   因此   type   int   hide   

原文地址:https://www.cnblogs.com/ctyakwf/p/12829458.html


评论


亲,登录后才可以留言!