POJ 2253 Frogger 最短路-Dijkstra的变形形式

题目地址: http://poj.org/problem?id=2253


题目大意,给n个点的坐标,要求从第一个点到第二个点所走的所有的边最大的那个边s。

求s的最小值。


用一个maxdis记录当前的最大值,

dis[i]表示的是,从1到i点走的边最大的那条边,

只要遇到2直接返回maxdis即可。


代码如下:

 

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <queue>
using namespace std;

/*
freopen("input.txt",  "r", stdin);
freopen("output.txt", "w", stdout);
*/

int n,s[205];
double edge[205][205],dis[205],x[205],y[205];
//这里的dis[i]表示的是,从1到i点走的边最大的那条边

double Dijkstra(int be)
{
    int i,j,k;
    double temp,maxdis=0;
    for(i=1;i<=n;i++)
    {
        dis[i]=edge[be][i];
        s[i]=0;
    }
    s[be]=1;dis[be]=0;
    for(i=1;i<=n;i++)
    {
        temp=0x7f7f7f7f;
        k=1;
        for(j=1;j<=n;j++)
            if(!s[j]&&dis[j]<temp)
            {
                k=j;temp=dis[j];
            }
        if(temp>maxdis)//如果当前最大的大于maxdis
            maxdis=temp;
        if(k==2)//如果到了2这个点,直接返回maxdis,因为没有要求走哪条路
            return maxdis;
        s[k]=1;
        for(j=1;j<=n;j++)
            if(!s[j])
            {
                double ss=edge[k][j];
                if(ss<dis[j])//如果从k到j小于从1到j
                    dis[j]=ss;
            }
    }
}

int main()
{

    int i,j,casei=0;
    while(cin>>n,n)
    {
        for(i=1;i<=n;i++)
        {
            edge[i][i]=0;
            scanf("%lf%lf",&x[i],&y[i]);
            for(j=1;j<i;j++)
            {
                double temp=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
                edge[i][j]=edge[j][i]=temp;
            }
        }
        printf("Scenario #%d\nFrog Distance = %.3f\n\n",++casei,Dijkstra(1));
    }
    return 0;
}


 

 

posted @ 2013-04-11 23:11  坚固66  阅读(125)  评论(0编辑  收藏  举报