http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1942
类似最短路算法,但不是求最短路
题意:给你一些石头的坐标,求能从起点到终点的所有路径中,最大的一次跳跃中的最小值
即:每条从起点到终点的路径中,都有一次跳跃是最大的,求的是所有路径中最大跳跃的最小值
#include<stdio.h>
#include<string.h>
#include<math.h>
#define M 250
#define oo 0xfffffff
int n;
bool v[M];
int dis[M];//保存从起点跳到任意点之间所有路径最大的一次跳跃长度的最小值
//求最短路则保存的是起点到任意点的最短距离
int que[M*M];
int Dis[M][M];//任意两点间的距离
struct point
{
int x;
int y;
}po[M];
int getlen(int i,int j)
{
return (po[i].x-po[j].x)*(po[i].x-po[j].x)+(po[i].y-po[j].y)*(po[i].y-po[j].y);
}
int max(int a,int b)
{
if(a>b) return a;
return b;
}
void SPFA()
{
int L=0,R=0,i,p;
memset(v,false,sizeof(v));
for(i=1;i<=n;i++)
dis[i]=oo;
dis[1]=0;
v[1]=true;
que[R++]=1;
while(L<R)
{
p=que[L++];
v[p]=false;
for(i=1;i<=n;i++)
{
int temp=max(dis[p],Dis[p][i]);
if(dis[i]>temp)
{
dis[i]=temp;
if(!v[i])
{
que[R++]=i;
v[i]=true;
}
}
}
}
}
int main()
{
int i,j;
int cas=1;
while(scanf("%d",&n)&&n)
{
for(i=1;i<=n;i++)
scanf("%d%d",&po[i].x,&po[i].y);
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
Dis[i][j]=Dis[j][i]=getlen(i,j);
SPFA();
printf("Scenario #%d\n",cas++);
printf("Frog Distance = %.3lf\n\n",sqrt(dis[2]));
}
return 0;
}
这题同样可以用类似最小生成树算法,下面是代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#define M 250
#define oo 0xfffffff
int n;
bool v[M];
int MIN[M];
int dis[M][M];
struct point
{
int x,y;
}po[M];
int Getlen(int i,int j)
{
return (po[i].x-po[j].x)*(po[i].x-po[j].x)+(po[i].y-po[j].y)*(po[i].y-po[j].y);
}
int max(int a,int b)
{
if(a>b) return a;
return b;
}
int Dijstra()
{
int i,j,p;
int min;
memset(v,false,sizeof(v));
for(i=1;i<=n;i++)
MIN[i]=dis[1][i];
v[1]=true;
for(i=1;i<n;i++)
{
min=oo;
for(j=1;j<=n;j++)
{
if(!v[j]&&MIN[j]<min)
{
min=MIN[j];
p=j;
}
}
if(p==2)
return min;
v[p]=true;
for(j=1;j<=n;j++)
{
if(!v[j]&&MIN[j]>max(MIN[p],dis[p][j]))
MIN[j]=max(MIN[p],dis[p][j]);
}
}
}
int main()
{
int i,j;
int cas=1;
int ans;
while(scanf("%d",&n)&&n)
{
for(i=1;i<=n;i++)
scanf("%d%d",&po[i].x,&po[i].y);
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
dis[i][j]=dis[j][i]=Getlen(i,j);
ans= Dijstra();
printf("Scenario #%d\n",cas++);
printf("Frog Distance = %.3lf\n\n",sqrt(ans));
}
return 0;
}