[kuangbin带你飞]专题四 最短路练习 - Frogger

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");
}

猜你喜欢

转载自blog.csdn.net/qq_40513946/article/details/80196754