POJ 2253 Dijstra 最短路变形

题目意思理解好久:

一开始以为还是求最短路径,结果wa了一次才发现连样例二都过不了。

最后才明白是求最大距离的最小值。换句话说,从第一个点(起点)到第二点(终点)有N种路径,一条路径的两个点之间的的最大距离定义为这条路径的“青蛙距离”,求N个中“青蛙距离”最小的。


与最裸的Dijstra相比,lowc[j] 本来保存的是 j 里源点的最短距离。现在保存的是:j 到源点路径中 最小的“青蛙距离”。


比如: 源点是1 ,lowc [ 1->j ]  有一个值,lowc [ p ] 为1->p 的最小的最大距离。现在更新 1->j 的值,原来有个值lowc[ j ](初始=mp[1][j],是直接从1 -> j,另外有一个走法是1->p、p->j,如果lowc[ j ]>max(lowc[ p ], mp[p][j]),肯定就选择第二中走法了,并且lowc[j]=max (lowc[ p ], mp[p][j])

灵活运用吧0-0


#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
#define INF 0x3f3f3f3f
double mp[1005][1005],lowc[202],x[202],y[202];
int vis[1005],n;
double dis(int a,int b)
{
    return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));
}
void Dijstra(int beg)
{
    for(int i=1;i<=n;i++)
    {
        lowc[i]=mp[beg][i];
        vis[i]=0;
    }
    lowc[beg]=0;
    for(int i=1;i<=n;i++)
    {
        int p=-1,j;
        double minc=2000;
        for(j=1;j<=n;j++)
            if(!vis[j] && lowc[j]<minc)
            {
                minc=lowc[j];
                p=j;
            }
        vis[p]=1;
        if(p==2) break;
        for( j=1;j<=n;j++)
            if(!vis[j] && lowc[j] > max(lowc[p],mp[p][j]))
                lowc[j]=max(lowc[p],mp[p][j]);
    }

}
int main()
{
    int cas=1;
    while(scanf("%d",&n) && n)
    {
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            mp[i][j]=2000;
        for(int i=1;i<=n;i++)
        {
            scanf("%lf%lf",&x[i],&y[i]);
            for(int j=1;j<i;j++)
                mp[i][j]=mp[j][i]=dis(i,j);
        }
        Dijstra(1);
        printf("Scenario #%d\nFrog Distance = %.3f\n\n",cas++,lowc[2]);
    }

    return 0;
}


你可能感兴趣的:(POJ 2253 Dijstra 最短路变形)