POJ 2253 Frogger -- 最短路变形

这题的坑点在POJ输出double不能用%.lf而要用%.f。。。真是神坑。

题意:给出一个无向图,求节点1到2之间的最大边的边权的最小值。

算法:Dijkstra

题目每次选择权值最小的边进行延伸访问,最坏情况下每条路径都要访问,复杂度O(n^2)

代码:

#include <iostream>

#include <cstdio>

#include <cstring>

#include <cmath>

#include <algorithm>

#define Mod 1000000007

using namespace std;

#define N 207



struct point

{

    int x,y;

}p[N];



int n;

double res,mini;

double way[N][N],d[N];

int vis[N];



void Dijastra()

{

    int i,j,k;

    for(i=1;i<=n;i++)

        d[i] = Mod;

    d[1] = 0;

    memset(vis,0,sizeof(vis));

    for(i=1;i<=n;i++)

    {

        mini = Mod;

        for(j=1;j<=n;j++)

        {

            if(!vis[j] && d[j] <= mini)

            {

                k = j;

                mini = d[j];

            }

        }

        vis[k] = 1;

        if(res < d[k] && d[k] != Mod)

            res = d[k];

        if(k == 2)

            return;

        for(j=1;j<=n;j++)

        {

            if(!vis[j])

                d[j] = min(d[j],way[k][j]);

        }

    }

}



double dis(point ka,point kb)

{

    return sqrt((ka.x-kb.x)*(ka.x-kb.x)+(ka.y-kb.y)*(ka.y-kb.y));

}



int main()

{

    int cs = 1,i,j;

    while(scanf("%d",&n)!=EOF && n)

    {

        for(i=1;i<=n;i++)

            scanf("%d%d",&p[i].x,&p[i].y);

        for(i=1;i<=n;i++)

        {

            for(j=i;j<=n;j++)

            {

                way[i][j] = way[j][i] = dis(p[i],p[j]);

            }

            way[i][i] = 0;

        }

        res = 0;

        Dijastra();

        printf("Scenario #%d\n",cs++);

        printf("Frog Distance = %.3f\n\n",res);  // %.3f

    }

    return 0;

}
View Code

 

你可能感兴趣的:(poj)