POJ2253—Dijkstra算法的变体的应用

来源:互联网 发布:洛瑞体测数据 编辑:程序博客网 时间:2024/06/06 00:18
题目大意求青蛙由起点跳到终点的过程中,在所有的路径中的最大步伐中的最小步伐。题目简单。

用Dijkstra算法解,但并非是求最小路径或最小路径长度。这里是Dijkstra算法的变体,结合贪心算法的思想,在走每一步时,选取距离最小(即步伐最小)的那一步走,每一次走都是在上一步的基础之上走的,用一个变量u记录每次通过的结点,再用一个变量记录已经走了的路径中的最大步伐,当u等于终点结点的编号时,就停止,输出最大步伐。详细见代码:

 

#include <iostream>#include <cstdio>#include <cmath>#include <cstdlib>#include <cstring>using namespace std;const int maxn=202;const int inf=2000;int n;double m;bool visit[maxn];double x[maxn],y[maxn],dist[maxn],w[maxn][maxn];double length(double x1,double y1,double x2,double y2){    return sqrt(pow(x2-x1,2)+pow(y2-y1,2));}void Dijkstra(int s,int t)          //起点v,终点t{    int i,j,u;    double mi;    for(i=0;i<n;i++)             //先处理第一个结点    if(i!=s)    dist[i]=w[s][i];    visit[s]=true;    for(i=1;i<n;i++)    {        mi=inf;        for(j=0;j<n;j++)       //在每次走的过程中,选取距离最小的那一步走        if(!visit[j] && dist[j]<mi)        {            mi=dist[j];            u=j;        }        if(mi>m)        m=mi;        if(u==t)        return ;        visit[u]=true;        for(j=0;j<n;j++)        if(!visit[j] && w[u][j]<dist[j])        dist[j]=w[u][j];    }}int main(){    int i,j,cas=1;    while(scanf("%d",&n) && n)    {        for(i=0;i<n;i++)        scanf("%lf%lf",&x[i],&y[i]);        for(i=0;i<n;i++)        for(j=0;j<n;j++)        w[i][j]=inf;        for(i=0;i<n;i++)        for(j=i+1;j<n;j++)        {            w[i][j]=length(x[i],y[i],x[j],y[j]);            w[j][i]=w[i][j];        }        memset(visit,0,sizeof(visit));        m=0;        Dijkstra(0,1);        printf("Scenario #%d\n",cas++);        printf("Frog Distance = %.3lf\n",m);        printf("\n");    }    return 0;}