POJ:2253 Frogger

跟UVa之前做的那道题是一样的,求起点到终点的最大边的最小值。

Bellmanford思想变形即可。这里注意最外层循环是点个数减一,而非边数,这里搞错了超时了一次。。

 

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#define MAXN 205
using namespace std;
struct Edge
{
    int from,to;
    double cost;
    void set(int a,int b,double v)
    {
        from=a;
        to=b;
        cost=v;
    }
};
int main()
{
    int n,kase=0;
    while(scanf("%d",&n)&&n)
    {
        int x[MAXN],y[MAXN];
        Edge p[MAXN*MAXN];
        int N=0;
        for(int i=0; i<n; ++i)
            scanf("%d%d",&x[i],&y[i]);
        for(int i=0; i<n; ++i)
            for(int j=i+1; j<n; ++j)
            {
                double d;
                d=sqrt((double)(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
                p[N++].set(i,j,d);
                p[N++].set(j,i,d);
            }
        double dism[MAXN*MAXN];
        memset(dism,0x7f,sizeof(dism));
        dism[0]=0;
        for(int i=0; i<n-1; ++i)
            for(int j=0; j<N; ++j)
            {
                int to=p[j].to,from=p[j].from;
                double v=p[j].cost;
                dism[to]=min(dism[to],max(dism[from],v));
            }
        printf("Scenario #%d\n",++kase);
        printf("Frog Distance = %.3lf\n\n",dism[1]);
    }
    return 0;
}


 

你可能感兴趣的:(Bellman-Ford)