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