#include<bits/stdc++.h>
int n,x[151],y[151];double a[151][151],b[151],s=1e10;
double _(int i,int j){
return sqrt(pow(x[i]-x[j],2)+pow(y[i]-y[j],2));
}//i,j 2 点距离计算
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d%d\n",x+i,y+i);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
a[i][j]=getchar()^48?_(i,j):1e10;
getchar();
}
for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
if(i^j&&k^i&&k^j)a[i][j]=std::min(a[i][j],a[i][k]+a[k][j]);
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(a[i][j]<1e10){
b[i]=std::max(b[i],a[i][j]);
}//算出目前每个点距离最远点的距离
for(int i=2;i<=n;i++)for(int j=1;j<i;j++)if(a[i][j]>=1e10)s=std::min(s,b[i]+b[j]+_(i,j));
//对任意不连通的牧场尝试连接
printf("%lf",s);
}
//本段代码无 dfs 染色,但即使这样做也一定无法通过
在一次又一次的运行中,这段代码输出的数据大都是 1010,而在评测机上也是类似,总只能通过那组 Hack 数据,而其它测试点全是 WA。即使我把 x,y 调成 double 数组,它依旧只通过 Subtask #1 的测试点,而对其它数据“一视同仁”,只能得 0 分。
#include<bits/stdc++.h>
using namespace std;
double f[151][151],m[151],minx=1e20,temp,
x[151],y[151],maxint=1e12;
double dist(int i,int j) //计算两点间的距离
{
return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])) ;
}
int main()
{
int i,j,n,k;char c;
cin>>n; //n个结点
for(i=1;i<=n;i++)
cin>>x[i]>>y[i]; //输入i结点坐标
for(i=1;i<=n;i++) //初始化f[i][j]
for(j=1;j<=n;j++)
{
cin>>c;
if(c=='1') f[i][j]=dist(i,j); //计算边长
else f[i][j]=maxint;//路径初始化
}
for(k=1;k<=n;k++) //Floyed 求最短路径
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j&&i!=k&&j!=k) //程序优化
if(f[i][j]>f[i][k]+f[k][j])
f[i][j]=f[i][k]+f[k][j];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
//m[i]:牧场内i牧区能到达其它牧区的最大距离
if(f[i][j]<maxint-1&&m[i]<f[i][j]) m[i]=f[i][j];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j&&f[i][j]>maxint-1)//不要用‘=’号比较
{
temp=dist(i,j); //计算无路径 i,j 两点间距离
if(minx>m[i]+m[j]+temp)
minx=m[i]+m[j]+temp;
}
for(i=1;i<=n;i++) if (m[i]>minx) minx=m[i];
printf("%.6lf",minx);
}
大致略读了一遍代码,我就将它进行了评测。谁知,这段代码竟然让我摆脱了 0 分,成就了 100 分(这段代码过不了最后一个测试点,也只是因为没有 dfs 的问题)。
到了这里,我的疑问又来了:既然两段代码的思路类似,那它们为什么会有不同的结果? 谁能帮我找找两段代码的不同,让 2 段代码都能趋近或达到完美呢?