Frogger
题目链接: B - Frogger POJ - 2253
## 题意
话说,这道题意真难理解,我看了好久,又看了题解才懂了题意。题目的意思是有N块石头并给出他们的坐标,青蛙要从第一块到第二块,设Max1为青蛙从起点到终点路径中跳的最远的距离,现在要求所有可能的路径中Max1最小的值
思路
看到了最大套最小,我们应该很轻易的想到用二分可以过,但是这样花费的时间会很多,如果我们对最短路理解深刻的话,可以直接上最短路,不过这里使用了最小生成数中的kruskal
代码
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
#include <string>
#include <queue>
#include <ctime>
#include <cmath>
#include <set>
#include <map>
using namespace std;
#define rep(i,j,k) for(int i = (int)(j);i <= (int)(k);i ++)
#define per(i,j,k) for(int i = (int)(j);i >= (int)(k);i --)
#define mmm(a,b) memset(a,b,sizeof(a))
#define sz(x) ((int)(x).size())
#define pb push_back
typedef double db;
typedef long long ll;
const int INF = (int)0x3f3f3f3f;
const int MAXN = (int)2e2+7;
double tep[MAXN][MAXN];
int fa[MAXN];
int cnt;
int N;
struct Node{
int x,y;
db cost;
Node(int x = 0,int y = 0,db c = 0):x(x),y(y),cost(c){}
}G[MAXN*MAXN];
struct Poi{
int x,y;
}P[MAXN];
bool cmp(const Node& a,const Node& b){
return a.cost < b.cost;
}
db cal(int i,int j){
return sqrt(1.0*(P[i].x - P[j].x)*(P[i].x - P[j].x) + 1.0*(P[i].y - P[j].y)*(P[i].y - P[j].y));
}
int find1(int x){
if (x != fa[x]) fa[x] = find1(fa[x]);
return fa[x];
}
bool Same(int x,int y){
return find1(x) == find1(y);
}
void Union(int x,int y){
int v = find1(x),u = find1(y);
if (v == u)return;
fa[v] = u;
}
db Kruskal(){
db res = 0;
sort(G+1,G+1+cnt,cmp);
rep(i,1,cnt){
if (!Same(G[i].x,G[i].y)){
Union(G[i].x,G[i].y);
res = max(G[i].cost,res);
}
if (Same(1,2))break;
}
return res;
}
void init(){
rep(i,0,N) fa[i] = i;
cnt = 0;
}
int main()
{
for (int ca = 1;scanf("%d",&N),N;ca ++) {
init();
rep(i,1,N){
scanf("%d %d",&P[i].x,&P[i].y);
rep(j,1,i-1){
G[++cnt] = Node(i,j,cal(i,j));
}
}
printf("Scenario #%d\nFrog Distance = %.3f\n\n",ca,Kruskal());
}
printf("\n");
}