POJ 2253 Frogger dijstra变形

青蛙距离,青蛙从一个石头跳到另一个石头,不能掉到水里。给出N个石头的坐标,问青蛙最少跳的距离。

开始以始点为源点,找到连该点的最长边。然后再以该点为源点。。。 当终点加入时停止

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#define Min(a,b)a<b?a:b
using namespace std;
float map[202][202],dis[202];
float X[202],Y[202], inf = 9999999.0;
bool vs[202];
int n;
float Max(float a, float b)
{
    return a > b ? a : b;
}
void dijstra()
{
    float MIN;
    int now=0,k,i,j,count=n-1;
    dis[0]=0;
    vs[0]=1;

    while(count--)
    {
        MIN=inf;
        for(i=1;i<n;i++)
        {
            if(!vs[i])
            {
                if(dis[i]>Max(dis[now],map[i][now]))
                  dis[i]=Max(dis[now],map[i][now]);
                if(MIN>dis[i])
                {
                    MIN=dis[i];
                    k=i;
                }
            }
        }
        if(k==1)return ;
        now=k;
        vs[k]=1;
    }
}
int main()
{
    int i,j;
    int CASE=0;
    float d,x2,y2,x1,y1;
    while(~scanf("%d",&n)&&n)
    {
        CASE++;
        for(i=0;i<n;i++)
        {
            dis[i]=inf;
            scanf("%f%f",&x1,&y1);
            X[i]=x1, Y[i]=y1;

            for(j=i-1;j>=0;j--)
            {
                x2=x1-X[j], y2=y1-Y[j];
                d=sqrt(x2*x2+y2*y2);
                map[i][j]=map[j][i]=d;
            }
        }
        memset(vs,0,sizeof(vs));
        dijstra();
        printf("Scenario #%d\n",CASE);
        printf("Frog Distance = %.3f\n\n",dis[1]);
    }
    return 0;
}

  

posted @ 2012-03-29 22:07  快乐.  阅读(144)  评论(0编辑  收藏  举报