大意是一只青蛙要从一点到达另一点,要求中间跳的过程中每一次的最大跳跃距离最小。
最短路spfa稍微改一下就行了。看网上大都是当连通图用floyd做的,没试过,不过感觉上是可以过得。
代码:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <iostream>
using namespace std;
typedef struct node{
int x,y;
}Node;
const int inf=0x3f3f3f3f;
int n;
Node node[205];
int dis[1005][1005];
bool had[1005][1005];
queue <int> q;
int M(int a,int b){
return (a>b)?a:b;
}
void spfa(){
memset(dis,0x3f,sizeof(dis));
memset(had,0,sizeof(had));
dis[node[1].x][node[1].y]=0;
q.push(1);
while(!q.empty()){
int t=q.front(); q.pop();
had[node[t].x][node[t].y]=0;
for(int i=1;i<=n;i++){
if(i==t) continue;
if(dis[node[i].x][node[i].y]>
M(dis[node[t].x][node[t].y],
((node[t].x-node[i].x)*(node[t].x-node[i].x)+
(node[t].y-node[i].y)*(node[t].y-node[i].y)))){
dis[node[i].x][node[i].y]=
M(dis[node[t].x][node[t].y],
((node[t].x-node[i].x)*(node[t].x-node[i].x)+
(node[t].y-node[i].y)*(node[t].y-node[i].y)));
if(!had[node[i].x][node[i].y]){
had[node[i].x][node[i].y]=1;
q.push(i);
}
}
}
}
}
int main(){
//freopen("in.txt","r",stdin);
int c=1;
while(cin>>n){
if(!n) break;
int x,y;
for(int i=1;i<=n;i++){
cin>>x>>y;
node[i].x=x;node[i].y=y;
}
spfa();
printf("Scenario #%d\n",c);c++;
printf("Frog Distance = %.3lf\n\n",sqrt((double)dis[node[2].x][node[2].y]));
}
return 0;
}