POJ-2253 Frogger-寻找最长边-bellman


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


你可能感兴趣的:(POJ-2253 Frogger-寻找最长边-bellman)