#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#define INF 0X3F3F3F3F
#define N 200
using namespace std;
double map[N][N];
double mdis[200];
int n;
int x[1001];
int y[1001];
void floyd(){
for(int k = 1; k <= n;k++){//floyd算法求最短路径
for(int i = 1; i <= n; i++){
for(int j = 1; j <=n; j++)
{
if(map[i][j] > map[i][k] + map[k][j] && k!=i && i!=j && j!=k){
map[i][j] = map[i][k] + map[k][j];
}
}
}
}
}
double f(int x1,int y1,int x2, int y2){//求直线距离公式
return sqrt(double((x1-x2)*(x1-x2)) + double((y1-y2)*(y1-y2)));
}
int main(){
cin >> n;
for(int i = 1 ; i <= n; i++)
cin >> x[i] >> y[i];
char s[1000][1000];
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
cin >> s[i][j];
if(s[i][j] == '1')//存储,1,表存在连通求两点间距离,0 边无法连通
{
map[i][j] = f(x[i],y[i],x[j],y[j]);
map[j][i] = f(x[i],y[i],x[j],y[j]);
}
else{
map[i][j] = INF;
map[j][i] = INF;
}
}
}
floyd();
memset(mdis,0,sizeof(mdis));//求最大距离
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
if(map[i][j] < INF && i!=j && (map[i][j] > mdis[i]))
mdis[i] = map[i][j];
}
}
double minn = INF;
for(int i = 1; i <= n; i++){//枚举不连通的俩点i,j,把他们连通,求最小值 res2
for(int j = 1; j <= n; j++){
if(map[i][j] == INF && i!=j && (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++)
{
if(mdis[i] > minn) minn = mdis[i];//然后在比较res1,和res2 求直径最小值
}
printf("%.6f\n",minn);
return 0;
}
问题 N: 2.4.3 Cow Tours牛的旅行
最新推荐文章于 2024-11-14 21:21:03 发布
该程序通过Floyd算法计算二维网格中两点间的最短路径,并找出不直接相连的两点间,通过其他节点的最大路径长度(直径)。程序首先读取网格数据,然后计算所有可能的路径,最后找到不直接相邻的两点,使得经过其他点的最远路径作为直径。
摘要由CSDN通过智能技术生成