题意:
有n个两个青蛙想见面,两个青蛙之间有n个石头,他必须一个一个跳过去。找到他女朋友。
问你他能找到他女朋友的情况下,最少的跳跃极限距离是多少。
题解:
建个图,跑一边spfa,就行了。
卧槽,我错的好惨啊,竟然是 因为我输出的是lf
改成f就过了。!!!!
double f; | G++提交 | C++提交 | 本机gcc测试 | 最安全的方法 |
输入 | scanf("%lf", &f); | scanf("%lf", &f); | scanf("%lf", &f); | cin >> f; |
输出 | printf("%f", f); | printf("%lf", f); | printf("%lf", f); | cout << f; |
大概就是这么多了,希望大家避免这种错误的发生。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;
const int inf=0xffffff;
const int maxn=222;
int cnt,n;
struct no{
int x,y;
}a[maxn];
struct node{
int to,nxt;
double w;
}edge[maxn*maxn];
int head[maxn];
int vis[maxn];
double dis[maxn];
void addedge(int x,int y,double val){
edge[++cnt].to=y;
edge[cnt].w=val;
edge[cnt].nxt=head[x];
head[x]=cnt;
}
double pow(int x){
return x*x*1.0;
}
void spfa(int s)
{
for(int i=1;i<=n;++i) dis[i]=inf;
queue <int> q;
memset(vis,false,sizeof(vis));
q.push(s);
dis[s]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=false;
for(int i=head[u];i!=-1;i=edge[i].nxt)
{
int v=edge[i].to;
if(dis[v]>max(edge[i].w,dis[u]))
{
dis[v]=max(edge[i].w,dis[u]);
if(!vis[v])
{
vis[v]=true;
q.push(v);
}
}
}
}
}
int main(){
int ca=1;
while(scanf("%d",&n)&&n){
cnt=0;
memset(head,-1,sizeof(head));
for(int i=1;i<=n;++i){
scanf("%d %d",&a[i].x,&a[i].y);
for(int j=1;j<i;++j){
double s=pow(a[i].x-a[j].x)+pow(a[i].y-a[j].y);
addedge(i,j,sqrt(s));
addedge(j,i,sqrt(s));
}
}
spfa(1);
printf("Scenario #%d\nFrog Distance = ",ca++);
printf("%.3f\n\n",dis[2]);
}
return 0;
}