#include<algorithm>
#include<climits>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=170;
const double INF=INT_MAX-1;
int n;
struct position{
int x, y;
double distance(const position &d){
return sqrt((x - d.x) * (x - d.x) + (y - d.y) * (y - d.y));
}
}a[maxn];
double diameter[maxn]= {0};
double ma[maxn][maxn];
int fid[maxn]= {0};
double map_sp[maxn]= {0.0};
void dfs(int i, int id) {
fid[i]=id;
// cout<<i<<" ";
for(int k=1; k<=n; k++)
if(!fid[k]&&ma[i][k]<INF)
dfs(k, id);
}
int main() {
cin>>n;
for(int i=1; i<=n; i++)
cin>>a[i].x>>a[i].y;
//初始化
char s[maxn];
for(int i=1; i<=n; i++){
cin>>s;
for(int j=1; j<=n; j++)
if(s[j]=='1'||i==j)
ma[i][j]=a[i].distance(a[j]);
else
ma[i][j]=INF;
}
//dfs
int id=0;
for(int i=1; i<=n; i++)
if(!fid[i])
dfs(i, ++id);
//floyd
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
for(int k=1; k<=n; k++)
if(ma[j][k]>ma[j][i]+ma[i][k])
ma[j][k]=ma[j][i]+ma[i][k];
//查找最大最短路与直径
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++)
if(ma[i][j]<INF)
map_sp[i]=max(map_sp[i], ma[i][j]);
diameter[fid[i]]=max(diameter[fid[i]], map_sp[i]);
}
// ans
double min_d = INF, max_d=-INF;
for (int i = 1; i <= n; i++)
for (int j = i + 1; j <= n; j++)
if (fid[i] != fid[j]) {
max_d = max(diameter[fid[i]], diameter[fid[j]]);
max_d = max(max_d, map_sp[i] + a[i].distance(a[j]) + map_sp[j]);
min_d = min(min_d, max_d);
}
printf("%.6f\n",min_d);
return 0;
}
为什么将范围从[1,n]改到[0,n)就可以过
而从[1,n]就会输出奇怪的答案呢
求dalao解释
orz 十分感谢