如果我用一个char的二维数组记录那几个牧区是通的,在计算牧区间的最短路径时,对小数据还能算对,但在n较大时候就会计算错误,不知道为什么,求救 下面第一个是我的,第二个是正确的(虽然过不了#11)
#include<iostream>
#include<cstdio>
#include<cmath>
const int maxn=152;
const double inf=0x3f3f3f3f;
using namespace std;
int n;
double x[maxn],y[maxn];
char k[maxn][maxn];
double mapp[maxn][maxn];
double m[maxn];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
cin>>k[i][j];
mapp[i][j]=inf;
if(k[i][j]=='1')
mapp[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j]) +(y[i]-y[j])*(y[i]-y[j]));
}
for(int kk=1;kk<=n;kk++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(k[i][kk]=='1'&&k[kk][j]=='1'&&i!=j)
mapp[i][j]=min(mapp[i][j],mapp[i][kk]+mapp[kk][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(mapp[i][j]!=inf&&i!=j) m[i]= m[i]>mapp[i][j]? m[i]:mapp[i][j];
double minn=inf;
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++)
if(k[i][j]=='0')
minn=min(minn,m[i]+m[j]+sqrt((x[i]-x[j])*(x[i]-x[j]) +(y[i]-y[j])*(y[i]-y[j])) );
//printf("%.6lf\n",minn);
for(int i=1;i<=n;i++) minn=max(minn,m[i]);
//for(int i=1;i<=n;i++) printf("%.6lf\n",m[i]);
printf("%.6lf\n",minn);
return 0;
}
#include<iostream>
#include<cstring>
#include<cmath>
#define INF 0x3f3f3f3f
using namespace std;
double mapp[200][200];
double mdis[200];
int n,x[1001],y[1001];
double f(int x1,int y1,int x2,int y2){
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d%d",x+i,y+i);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
char c;
cin>>c;
mapp[i][j]=mapp[j][i]= c=='1'||i==j?f(x[i],y[i],x[j],y[j]):INF;
}
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
mapp[i][j]=min(mapp[i][j],mapp[i][k]+mapp[k][j]);
memset(mdis,0,sizeof(mdis));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(mapp[i][j]<INF&&(mapp[i][j]>mdis[i]))//从i点出发的牧场直径
mdis[i]=mapp[i][j];
double minn=INF;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(mapp[i][j]==INF&&(mdis[i]+mdis[j]+f(x[i],y[i],x[j],y[j])<minn))
minn=mdis[i]+mdis[j]+f(x[i],y[i],x[j],y[j]);
for(int i=1;i<=n;i++)//最短直径不小于任何一个分牧场的直径
minn=max(minn,mdis[i]);
//for(int i=1;i<=n;i++) printf("%.6lf\n",mdis[i]);
printf("%.6lf",minn);
return 0;
}