题意:
有N块石头,有一个青蛙想从第一块蹦到第2块,但是这个青蛙的弹跳力有限,问,如果想从第一块蹦到第二块,对于所有的路径每条路径所需要蹦的最大
距离的最小值为多少?
解法:
把任意两点间的距离从小到大排序。
然后从小到大搜,直至搜到第一个石头和第二个石头都搜过了。
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
struct list
{int x;int y;
}point[1000];
struct listt
{int x;int y;double len;
}bian[100000];
int fx[10000];
double lens(int x,int y)
{return sqrt((point[x].x-point[y].x)*(point[x].x-point[y].x)+(point[x].y-point[y].y)*(point[x].y-point[y].y));
}
int cmp(struct listt a,struct listt b)
{return a.len<b.len;
}
int find(int x)
{while(x!=fx[x])x=fx[x];return x;
}
int main()
{int n,i,j,leap;int leapp=0;while(scanf("%d",&n)&&n){leapp++;for(i=0;i<n;i++)fx[i]=i;for(i=0;i<n;i++){scanf("%d%d",&point[i].x,&point[i].y);}leap=0;for(i=0;i<n;i++){for(j=0;j<i;j++){bian[leap].x=i;bian[leap].y=j;bian[leap++].len=lens(i,j);}}sort(bian,bian+leap,cmp);for(i=0;i<leap;i++){if(find(1)==find(0))break;fx[find(bian[i].x)]=find(bian[i].y);}printf("Scenario #%d\nFrog Distance = %.3f\n\n",leapp,bian[i-1].len);}return 0;
}