P1522 牛的旅行

  这题挺好……有几个坑……(反正我都跳进去了)

  对于新的更大的图,由于求的是最小连接边,所以它的值可能小于之前单独一个图的最长的最短路……

  所以之后的值应该取个max(emmm……)

  所以第一次我只拿了70。。。

  而且还有一个小问题……注意Floyd。。。(自己想)

  代码:

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
#define maxn 200
#define inf 99999999.0
struct node
{
    int x,y;
} a[maxn];
int n;
double dis[maxn][maxn],la[maxn],ro[maxn],ans=inf,now;
double Dis(int i,int j)
{
    return sqrt(pow(a[i].x-a[j].x,2)+pow(a[i].y-a[j].y,2));
}
int main()
{
    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++)
    {
        int op;
        scanf("%1d",&op);
        if(i==j) continue; 
        if(op==1) dis[i][j]=Dis(i,j);
        else 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++)
    dis[i][j]=min(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) continue;
        la[i]=max(la[i],dis[i][j]);
        now=max(now,la[i]);
    }
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    if(dis[i][j]==inf) ans=min(ans,la[i]+la[j]+Dis(i,j));
    printf("%.6lf",max(now,ans));
    return 0;
} 

  

猜你喜欢

转载自www.cnblogs.com/popo-black-cat/p/10140849.html