给出一堆在坐标轴上的点,求起点到终点的一条合法路径中,最长的边,作为一个ans,
求所有ans中 最小的一个ans
思路:直接从起点开始,去更新所有到达所有点的ans值,直到无法更新,即队列为空
dis[2]存的便是起点到终点的 最小的一个ans值
数据太水? 32ms
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
double min(double a,double b)
{ return a>b?b:a;}
double max(double a,double b)
{ return a<b?b:a;}
int inf=2147483647;
double eps=0.000001;
struct node
{
int v;
double d;
node(){}
node(int vv,double a1 )
{v=vv;d=a1;}
};
vector <node> mp[205];
int n;
double dis[205];
int vis[205];
int bellman( )
{
queue<int> q;
int i;
for (i=1;i<=n;i++)
dis[i]=inf;
dis[1]=0;
q.push(1);
while(!q.empty())
{
int tp=q.front() ;
q.pop();
for (i=0;i<mp[tp].size();i++)
{
int v=mp[tp][i].v;
double tmp=max(dis[tp],mp[tp][i].d);
if (eps+tmp<dis[v] )
{
dis[v]=tmp;
q.push(v);
}
}
}
return 0;
}
int xx[205];
int yy[205];
int main()
{
int u,v,i,j;
int x,y;
int stx,sty;
int edx,edy;
int cnt=1;
while(scanf("%d",&n)!=EOF)
{
if (!n) break;
scanf("%d%d",&stx,&sty);
xx[1]=stx;yy[1]=sty;
scanf("%d%d",&edx,&edy);
xx[2]=edx;yy[2]=edy;
for (i=3;i<=n;i++)
{
scanf("%d%d",&xx[i],&yy[i]);
}
for (i=1;i<=n;i++)
{
mp[i].clear();
for (j=1;j<=n;j++)
{
if (i==j)continue;
double dd=(xx[i]-xx[j])*(xx[i]-xx[j])+(yy[i]-yy[j])*(yy[i]-yy[j]);
dd=sqrt(dd);
mp[i].push_back( node(j,dd));
}
}
bellman();
printf("Scenario #%d\n",cnt++);
printf("Frog Distance = %.3lf\n\n",dis[2]);
}
return 0;
}