Frogger
题 意:池塘里有一只男青蛙,一只女青蛙,男青蛙想去拜访女青蛙。男青蛙在1号石头上,女青蛙在2号石头上,池塘里还有一些其他的石头,可以给男青蛙跳的时候短暂停息。问男青蛙一次跳的最大长度最小是多少。祠堂总共有n的石头.
数据范围:
2<=n<=200
0<=xi,yi<=1000
样例输入:
2 //n个石头
0 0 //石头坐标
3 4
3
17 4
19 4
18 5
0//输出结束
样例输出:
Scenario #1
Frog Distance = 5.000
Scenario #2
Frog Distance = 1.414
思 路:最短路的变型,以前更新最短距离,现在更新到节点j的最大距离最小是多少。每次取最大距离最小的点出来更新就行。
收 获:对dijkstra有了更加深刻的理解。扩宽了写最短路的思维。
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
const double INF = 0x3f3f3f3f;
const int maxn = 1e3+5;
typedef pair<double,int> P;
struct edge{
int to;
double cost;
};
struct node{
double x,y;
int id;
}a[maxn];
vector<edge> G[maxn];
double d[maxn];
int n;
double dis(double x1,double y1,double x2,double y2){
double temp1 = (x1-x2)*(x1-x2);
double temp2 = (y1-y2)*(y1-y2);
return sqrt(temp1+temp2);
}
void dijkstra(int s){
fill(d,d+1+n,INF);
d[s] = 0;
priority_queue<P,vector<P>,greater<P> >que;
que.push(P(0,s));
while(que.size()){
P p = que.top();que.pop();
int v = p.second;
if(p.first > d[v]) continue;
for(int i=0;i<G[v].size();i++){
edge e = G[v][i];
double temp = max(d[v],e.cost);
if(d[e.to] > temp){
d[e.to] = temp;
que.push(P(d[e.to],e.to));
}
}
}
}
void init(){
for(int i=0;i<=n;i++)G[i].clear();
memset(d,0,sizeof(d));
}
int main(){
int Case = 1;
while(~scanf("%d",&n) &&n){
init();
for(int i=1;i<=n;i++){
scanf("%lf %lf",&a[i].x,&a[i].y);
a[i].id = i;
}
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
double temp = dis(a[i].x,a[i].y,a[j].x,a[j].y);
G[i].push_back(edge{j,temp});
G[j].push_back(edge{i,temp});
}
}
dijkstra(1);
printf("Scenario #%d\n",Case++);
printf("Frog Distance = %.3f\n\n",d[2]);
}
return 0;
}