牛的旅行 Cow Tours

题面

这一题就是用floyd求一遍最短路,然后找出每一个点联通的距离它最远的点,然后记录下来,最后再枚举任意两个不连通的点,将它们联通,这样就可以根据两点之间的距离公式以及两个点各自的最大距离,就是新连接的两个牧场的直径

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
using namespace std;
const int maxn=150+10;
const int inf=0x3f3f3f3f;
struct node
{
    int x;
    int y;
}a[maxn];
double cal(int i,int j)
{
    return sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));
}
int n;
double dis[maxn][maxn],ldis[maxn],l1,l2=inf,ans;
int main()
{
    int tmp;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&a[i].x,&a[i].y);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            scanf("%1d",&tmp);
            if(tmp)dis[i][j]=cal(i,j);
            else if(i!=j)dis[i][j]=inf;
        }    
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                if(dis[i][k]+dis[k][j]<dis[i][j])
                    dis[i][j]=dis[i][k]+dis[k][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            if(dis[i][j]!=inf)ldis[i]=max(dis[i][j],ldis[i]);
            l1=max(l1,ldis[i]);
        }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(dis[i][j]==inf)
                l2=min(ldis[i]+cal(i,j)+ldis[j],l2);
    ans=max(l1,l2);
    printf("%.6f",ans);
    return 0;
}

  

上一篇:【洛谷 1821】银牛派对Silver Cow Party


下一篇:[洛谷]P2853 [USACO06DEC]牛的野餐Cow Picnic (#图的遍历)