POJ 2253 Frogger Kruskal最小生成树求解

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66569#problem/B


题意:给定起点和终点,求从起点到终点的所有路径中,所需想最小跳跃范围。

此题在最短路的专题,但是,拿到此题第一想到的还是:把边值排序,然后依次加入加入最小边,起点和终点一旦连通,那么解就是这条边了,值的注意的是,此题需要注意精度的处理,必须等到得出结果后才开根,否则会导致精度差而WA(本以为小数点后三位没多大紧)。

PS:double的输入用%lf,但是输出却用%f,upper_bound和lower_bound都是查找下界。

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>

using namespace std;

struct edge{
    int x,y,dis;
    bool operator<(const edge &a)const{
        return dis<a.dis;
    }
}E[40000];

int n,X[220],Y[220],tot,ans,pre[220];

int find(int t){//并查集查找操作
    return t==pre[t]? t:pre[t]=find(pre[t]);
}

int add(int t){
    pre[find(E[t].y)]=find(E[t].x);//把y加入x集合
    if(find(0)==find(1)) return 1;
    return 0;
}

int main(){
    //freopen("D:\\in.txt","r",stdin);
    int kase=1;
    while(cin>>n && n){
        for(int i=0;i<n;i++) scanf("%d %d",X+i,Y+i);
        tot=0;
        for(int i=0;i<n;i++) for(int j=i+1;j<n;j++){
            int t=(X[i]-X[j])*(X[i]-X[j])+(Y[i]-Y[j])*(Y[i]-Y[j]);
            E[tot++]=(edge){i,j,t};
        }
        sort(E,E+tot);
        for(int i=0;i<n;i++) pre[i]=i;//初始化并查集
        for(int i=0;i<tot;i++)//枚举边
            if(add(i)) {ans=E[i].dis;break;}
        printf("Scenario #%d\nFrog Distance = %.3f\n\n",kase++,sqrt((double)ans));
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值