此题。
调了2+小时。。 终其原因: 1、pow1(x) (x)*(x) ! 2、memset(127) 可能比 1e10 小exin 至极 , 铭记!
#include#include #include #include #include #include #include #include #define pow1(x) (x)*(x) #define maxint 1e10using 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] 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;}