题目链接:
https://www.luogu.org/problem/P1522
参考博客:
https://www.luogu.org/blog/ylsoi/solution-p1522
思路:
1:先用floyd求多源最短路,即一个节点到其他任意节点的最短路
2:然后对每一个节点,计算出它到其他可以到达的节点的最短路中的最大值,存在d[maxn]数组中
3:对于不可以直接到达的节点,我们一条一条的连上边,然后取d[i]+d[j]+edge(i,j)的最小值
if(dis[i][j]==inf)
{
dmax2=min(dmax2,d[i]+edge(i,j)+d[j]);
}
注意:
1:新连通的大牧场的直径怎么会比原来的小牧场的直径小呢?
#include <bits/stdc++.h>
using namespace std;
const int maxn=151;
const double inf=0x3f3f3f3f;
struct point
{
int x,y;
}p[maxn];
double edge(int i,int j)
{
return sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y));
}
int n,temp;
double dis[maxn][maxn],d[maxn],dmax1,dmax2=inf,ans;
int main()
{
ios::sync_with_stdio(0);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%1d",&temp);
if(temp)dis[i][j]=edge(i,j);
else if(i!=j)dis[i][j]=inf;
}
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(dis[i][j]>dis[i][k]+dis[k][j])
{
dis[i][j]=dis[i][k]+dis[k][j];
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(dis[i][j]!=inf)
{
d[i]=max(d[i],dis[i][j]);
}
dmax1=max(dmax1,d[i]);
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(dis[i][j]==inf)
{
dmax2=min(dmax2,d[i]+edge(i,j)+d[j]);
}
}
ans=max(dmax1,dmax2);
}
printf("%.6lf",ans);
return 0;
}