给出一堆在坐标轴上的点,求起点到终点的一条合法路径中,最长的边,作为一个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; }