POJ2253 Frogger Dijkstra & Floyd

来源:互联网 发布:java byte转char 编辑:程序博客网 时间:2024/05/16 11:24

题目大意:有两只青蛙A,B和n块石头(编号为1到n,青蛙A在1号,青蛙B在2号),已知每个石头的坐标和两只青蛙的坐标,现在让你确定青蛙的forg distance:在青蛙A到青蛙B所在石块的一条路径中,我们在该路径中每两点之间的距离中把最大值拿出来,再在所有A到B的通路中的这些最大值当中,找出最小值输出。



分析:我感觉题意超难理解。。。好吧,我承认我英语太菜。

对于这题呢,Dijkstra算法和Floyd算法都可以,关键在于把保存最短路的那部分改成保存forg distance就行了。


Dijkstra实现代码如下:

#include <cstdio>#include <iostream>#include <cmath>using namespace std;#define MAX 205#define INF 999999999bool s[MAX];double dis[MAX];int n,x[MAX],y[MAX];double dist(int i,int j){    return sqrt((double)(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));}void Dijkstra(){    for(int i=1;i<=n;i++)    {        dis[i]=INF;        s[i]=false;    }    dis[1]=0;    s[1]=true;    for(int i=1;i<=n;i++)    {        double tmp=INF;        int u=1;        for(int j=1;j<=n;j++)          if(!s[j]&&tmp>dis[j])          {              tmp=dis[j];              u=j;          }        if(u==2) break;        s[u]=true;        for(int j=1;j<=n;j++)          if(!s[j]&&dis[j]>max(dis[u],dist(u,j)))            dis[j]=max(dis[u],dist(u,j));    }}int main(){    int T=1;    while(scanf("%d",&n)&&n)    {        for(int i=1;i<=n;i++)          scanf("%d%d",&x[i],&y[i]);        Dijkstra();        printf("Scenario #%d\nFrog Distance = %.3f\n\n",T++,dis[2]);    }    return 0;}

Floyd实现代码如下:

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<string>using namespace std;#define INF 999999999#define MAX 205double dis[MAX][MAX];int x[MAX],y[MAX];int n;double dist(int i,int j){    return sqrt((double)(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));}void floyd(){    for(int i=1;i<=n;i++)        for(int j=1;j<=n;j++)            dis[i][j]=dist(i,j);    for(int k=1;k<=n;k++)        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++)                dis[i][j]=min(dis[i][j],max(dis[i][k],dis[k][j]));}int main(){    int T=1;    while(scanf("%d",&n) && n)    {        for(int i=1;i<=n;i++)          scanf("%d%d",&x[i],&y[i]);        floyd();        printf("Scenario #%d\nFrog Distance = %.3f\n\n",T++,dis[1][2]);    }    return 0;}


0 0
原创粉丝点击