[kuangbin带你飞]专题四 最短路练习 [Cloned] - Virtual Judge
湖中有n块石头,编号从1到n,有两只青蛙,Bob在1号石头上,Alice在2号石头上,Bob想去看望Alice,但由于水很脏,他想避免游泳,于是跳着去找她。但是Alice的石头超出了他的跳跃范围。因此,Bob使用其他石头作为中间站,通过一系列的小跳跃到达她。两块石头之间的青蛙距离被定义为两块石头之间所有可能路径上的最小必要跳跃距离,某条路径的必要跳跃距离即这条路径中单次跳跃的最远跳跃距离。你的工作是计算Alice和Bob石头之间的青蛙距离。
这题我用的是Dijkstra,这题算是一道最短路的变形题,加深了我对朴素Dijkstra算法的理解。不同点在何处?在于动态方程的转变,并非简单的去求路程和的最短,而是要求的是所能到达路径中最大路径的最小距离。
代码如下:
#include<stdio.h>
#include<iostream>
#include<map>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
double mapp[505][505];
double dis[1005];
bool c[1005];
struct we{
double x,y;
}hh[2005];
int main(){
ll n;
int an=0;
while(~scanf("%lld",&n)){
if(n==0)break;
an++;
printf("Scenario #%d\n",an);
printf("Frog Distance = ");
for(int i=1;i<=n;i++){
scanf("%lf%lf",&hh[i].x,&hh[i].y);
c[i]=0;
}
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
mapp[i][j]=mapp[j][i]=sqrt((hh[i].x-hh[j].x)*(hh[i].x-hh[j].x)+(hh[i].y-hh[j].y)*(hh[i].y-hh[j].y));
}
}
dis[1]=0;
for(int i=2;i<=n;i++){
dis[i]=mapp[1][i];
}
c[1]=1;
for(int i=1;i<n;i++){
int k=-1;
for(int j=1;j<=n;j++){
if(c[j]==0&&(k==-1||dis[j]<dis[k])){
k=j;
}
}
c[k]=1;
for(int j=1;j<=n;j++){
dis[j]=min(dis[j],max(dis[k],mapp[k][j]));
}
}
printf("%.3lf\n\n",dis[2]);
}
}