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;
}

浙公网安备 33010602011771号