POJ T2253 Frogger
题目思路:
求的是青蛙跳到2这个点的路径中,最小的单次跳跃距离,并不是1---2的最短跳跃距离。
那么模板的松弛方法就需要修改了。
原 :min(dis[j],dis[p]+maps[p][j]);
改后:min(dis[j],max(dis[p],maps[p][j]));
因为是最小的单次跳跃距离,所以要先求本路径的最大的单次跳跃距离,再与其他路径相比较,取整体的最小的单次跳跃距离。
Dijkstra写法
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define INF 0x3f3f3f3f
#define maxn 205
using namespace std;
bool vis[maxn];
int n;
double dis[maxn],maps[maxn][maxn];
struct point{
double x,y;
}p[maxn];
void Init(){
for(int i = 1; i <= n; i++){
vis[i] = false;
dis[i] = INF;
for(int j = 1; j <= i; j++)
i==j ? maps[i][j] = 0 : maps[i][j] = maps[j][i] = INF;
}
}
void Dijkstra(int s){
dis[s] = 0;
for(int i = 1; i <= n ; i++){
int p = 0, minn = INF;
for(int j = 1; j <= n; j++){
if(!vis[j] && minn > dis[j]){
p = j;
minn = dis[j];
}
}
vis[p] = true;
for(int j = 1; j <= n; j++){
if(!vis[j]){
dis[j] = min(dis[j],max(dis[p],maps[p][j]));
}
}
}
}
int main(){
int kcase = 0;
while(scanf("%d",&n)&&n){
Init();
for(int i = 1; i <= n; i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
for(int i = 1; i <= n; i++)
for(int j = i+1; j <= n; j++)
maps[i][j] = maps[j][i] = sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y));
Dijkstra(1);
printf("Scenario #%d\n",++kcase);
printf("Frog Distance = %.3lf\n\n",dis[2]);
}
return 0;
}