此题。
调了2+小时。。
终其原因:
1、pow1(x) (x)*(x) !
2、memset(127) 可能比 1e10 小
exin 至极 , 铭记!
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstdio>
#include<cmath>
#define pow1(x) (x)*(x)
#define maxint 1e10
using namespace std;
int n;
double dis[151][151],mdis[151],zx[151],zy[151];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
zx[i]=x,zy[i]=y;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
char c;
cin>>c;
if(c=='1')
{
dis[i][j]=sqrt(pow1(zx[i]-zx[j])+pow1(zy[i]-zy[j]));
}
else dis[i][j]=maxint;//初始化
}
}
for(int k=1;k<=n;k++)//floyed
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i!=j&&i!=k&&j!=k)
if(dis[i][k]<maxint-1&&dis[k][j]<maxint-1)//如果大于maxint ,则两个点不连通 ,即在两个牧场内
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(i!=j&&dis[i][j]<maxint-1)
{
mdis[i]=max(dis[i][j],mdis[i]);//求每个点到其他点距离 的最大值
}
}
double len1=0;
for(int i=1;i<=n;i++)
if(mdis[i]>len1) len1=mdis[i];//len1 为两个牧场的大的那个直径
double len2=1e20;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i!=j&&dis[i][j]>maxint-1)
{
len2=min(mdis[i]+mdis[j]+sqrt(pow1(zx[i]-zx[j])+pow1(zy[i]-zy[j])),len2);
}
}
}
double ans;
ans=max(len1,len2);//连接后两个最小直径 与 一个牧场的直径取最大值 (为防止牧场套牧场的情况)
printf("%.6lf",ans);
return 0;
}