zoukankan      html  css  js  c++  java
  • AcWing1125 牛的旅行(floyd)

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

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

    #include<iostream>
    #include<string>
    #include<algorithm>
    #include<cmath>
    #define x first
    #define y second
    using namespace std;
    typedef pair<double,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<=n;i++){
            cin>>q[i].x>>q[i].y;
        }
        for(i=1;i<=n;i++){
            cin>>s[i];
        }
        int j;
        for (int i =1; i <= n; i ++ )
            for (int j = 1; j <= n; 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<=n;k++){
            for(i=1;i<=n;i++){
                for(j=1;j<=n;j++){
                    d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
                }
            }
        }
        double r1=0;
        for(i=1;i<=n;i++){
            for(j=1;j<=n;j++){
                if(d[i][j]<inf/2)
                maxd[i]=max(maxd[i],d[i][j]);
            }
            r1=max(r1,maxd[i]);
        }
        double r2=inf;
        for(i=1;i<=n;i++){
            for(j=1;j<=n;j++){
                if(d[i][j]>inf/2){
                    r2=min(r2,maxd[i]+maxd[j]+get(i,j));
                }
            }
        }
        printf("%.6f
    ",max(r1,r2));
    }
    View Code
  • 相关阅读:
    汉语-词语:注重
    汉语-词语:解释
    汉语-词语:接受
    汉语-词语:专注
    汉语-词语:构想
    生物-植物-果树:枣树
    汉语-词语:维度
    汉语-词语:真传
    XML基础知识学习
    Java Swing界面编程(25)---事件处理:鼠标事件及监听处理
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/12829458.html
Copyright © 2011-2022 走看看