POJ 2253 Frogger Dijkstra变形

来源:互联网 发布:怎样学好linux 编辑:程序博客网 时间:2024/06/03 22:57

题目链接

Frogger

题意

Freddy所在石头编号为1,Fiona 所在石头编号为2。给出V个石头的坐标,任意两个石头间的距离即其直线距离。求从1石头到2石头所有路径的最长边的最小值。

思路

更改Dijkstra的更新方式。注意输出格式最后一行没回车。以及,POJ输出double用%f。。。。

代码

#include <iostream>#include <vector>#include <queue>#include<cmath>#include <string.h>using namespace std;const int MAXN=1000;const int INF=0xfffffff;double mmap[MAXN][MAXN];struct Node{    int x;    int y;} node[300];int V;bool vis[MAXN];double d[MAXN];double sq(Node a,Node b){    return sqrt((double)((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));}void dijkstra(){    memset(vis,0,sizeof vis);    for(int i=1;i<=V;i++) d[i]=(i==1)?0:INF;    for(int i=1;i<=V;i++)    {        int x,m=INF;        for(int y=1;y<=V;y++)        {            if(!vis[y]&&d[y]<=m)            {                x=y;                m=d[x];            }        }        vis[x]=1;        for(int y=1;y<=V;y++) d[y]=min(d[y],max(d[x],mmap[x][y]));    }}int main(){    //cout<<INF<<endl;    //freopen("out.txt","w",stdout);    int kase=0;    while(~scanf("%d",&V)&&V)    {        memset(mmap,0,sizeof mmap);        memset(d,0,sizeof d);        for(int i=1; i<=V; i++)        {            scanf("%d %d",&node[i].x,&node[i].y);        }        for(int i=1; i<=V; i++)            for(int j=i; j<=V; j++)            {                mmap[i][j]=mmap[j][i]=sq(node[i],node[j]);            }        dijkstra();        if(kase) printf("\n");        printf("Scenario #%d\nFrog Distance = %.3f\n",++kase,d[2]);    }    return 0;}
原创粉丝点击