POJ 2253 Frogger 最小生成树

来源:互联网 发布:登录注册js特效 编辑:程序博客网 时间:2024/05/29 16:18

题意:两只青蛙在湖水中的石头上,意志青蛙想去拜访另外一只,湖中还有其他的一些空石头,青蛙可以借助这些石头跳到另外一个青蛙处,但是这只青蛙不想用很大的力跳,它想借助石头让自己跳的最大距离尽量小,选出一条路线,到达另外一只青蛙时最大跳跃距离最小。

思路:考虑kruskal过程,当两者合并在一个集合中时说明可以相互到达了,这时的边就是最小的。

输出double G++  交题和C++交题不同 。G++输出用%f,C++用%lf。否则WA

#include<cstdio>#include<algorithm>#include<cmath>const int maxn = 210;using namespace std;int f[maxn];struct edge{int from,to;double w;}e[maxn*maxn+20];//完全图 struct pt{int x,y;}p[maxn];double dis(int i,int j){double d;d=(p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y);return sqrt(d);}int Find(int x){return f[x]==x?x:f[x]=Find(f[x]);}bool cmp(edge a,edge b){return a.w<b.w;}int main(){int n;int cas=0;//freopen("out1.txt","w",stdout);while(~scanf("%d",&n)&&n){for(int i=0;i<n;i++)scanf("%d%d",&p[i].x,&p[i].y);int cnt=0;for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){e[cnt].from=i,e[cnt].to=j;e[cnt++].w=dis(i,j);}}sort(e,e+cnt,cmp);double ans=-1;for(int i=0;i<n;i++)f[i]=i;for(int i=0;i<cnt;i++){int u=e[i].from,v=e[i].to;int xx=Find(u);int yy=Find(v);if(xx!=yy){f[xx]=yy;if(Find(0)==Find(1))//两点已经连通了,就输出当前最大边 {ans=e[i].w;break;}}}printf("Scenario #%d\nFrog Distance = ",++cas);printf("%.3f\n",ans);printf("\n");}}