poj2253Frogger(dijkstra求最小边权问题)

来源:互联网 发布:巨人网络 借壳猜想 编辑:程序博客网 时间:2024/06/02 03:55

题意:输入n表示河中有n个石头,接下来n行表示这n个石头的坐标,第一个坐标是青蛙1的坐标,第二个是青蛙2的坐标,从1号点,到2号点,找一条能通过的路,使得这条路中的最大的边,比其它所有可能的路中的最大边都小,其中每一个石头可以跳向任意一个石头。

答题思路:

首先将所有与1号点相连的点的编号及两者边权值push到优先队列,每一次top一个最小边权值的点,若该点就是2号点,则其对应边权值即为1到2的所有路中边权值最小的一条,

那如果这个点不是2号点呢?没关系,把该点(假设是3号)和与其相连的点松弛,即将3号和与其相连的点(如4号点)的边权(距离)与1号点到3号点的最小边权比较,若3号点和与4号点的边权比1号点到3号点的最小边权小,则1号点到4号点的最小边权等于1号点到3号点的最小边权,否则1号到4号的最小边权等于3号到4号的边权;如此一直找,知道top出的点为2号点就结束。点击打开链接

#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<cmath>using namespace std;struct node{double x,y;double distance;int num;node(double a=0,double b=0,double c=0,int d=0){x=a;y=b;distance=c;num=d;}bool operator <(const node &p)const{return distance>p.distance;}};node p[210];priority_queue<node>q;double dis(double a1,double b1,double a2,double b2){return sqrt((a1-a2)*(a1-a2)+(b1-b2)*(b1-b2));}int main(){int i,j,v=1,n,vis[210];while(scanf("%d",&n)&&n){memset(vis,0,sizeof(vis));while(!q.empty())q.pop();vis[0]=1;for(i=0;i<n;i++){scanf("%lf%lf",&p[i].x,&p[i].y);if(i>0)q.push(node(0,0,dis(p[0].x,p[0].y,p[i].x,p[i].y),i));}printf("Scenario #%d\n",v++);while(!q.empty()){node temp=q.top();q.pop();if(temp.num==1){    printf("Frog Distance = %.3lf\n\n",temp.distance);    break;}vis[temp.num]=1;for(i=0;i<n;i++){if(vis[i]==0){if(temp.distance<dis(p[temp.num].x,p[temp.num].y,p[i].x,p[i].y))q.push(node(dis(p[temp.num].x,p[temp.num].y,p[i].x,p[i].y),i));else q.push(node(0,0,temp.distance,i));}}}}}

0 0
原创粉丝点击