題意:給出n個島的座標,要從第一個到跳到第二個島,跳的時候有個距離限制,求出這個距離的最小值。
思路:剛開始限制距離爲兩島的直接距離,用二分每得到一個距離mid,判斷1個2是否能連通。就求出最小的限制距離了。
#include<string.h>
#include<math.h>
#include<stdio.h>
const int N=210;
int f[N],n;
double map[N][N];
struct node
{
int x,y;
}p[N];
double dist(int i,int j)
{
return sqrt(1.0*(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 find(int a)
{
if(a!=f[a])f[a]=find(f[a]);
return f[a];
}
int judge(double D)
{
int i,j;
for(i=1;i<=n;i++)
f[i]=i;
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
if(map[i][j]<D)//小於限制的距離
{
f[find(i)]=find(find(j));
}
}
if(find(1)==find(2))return 1;
return 0;
}
int main()
{
int i,j,op=1;
while(scanf("%d",&n),n)
{
for(i=1;i<=n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
for(j=1;j<i;j++)
{
map[i][j]=map[j][i]=dist(i,j);
}
}
double left,right,mid;
left=0;right=map[1][2];
while(right-left>1e-7)
{
mid=(left+right)/2;
if(judge(mid))
{
right=mid;
}
else left=mid;
}
printf("Scenario #%d\n",op++);
printf("Frog Distance = %.3f\n\n",right);
}
return 0;
}