首页 > 代码库 > POJ 2253 Frogger

POJ 2253 Frogger

多种方法,可以理解为最短路变形。

也可以当作最小生成树。

题意理解就很简单。


青蛙A到青蛙B之间距离中某一次跳的距离,选出最大的。

写了2个最短路的。SPFA 和 Dijkstra。

顺便熟悉一下最小生成树,也写个Kruskal 的。


SPFA:

#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<cmath>
#define INF 0x7fffffff
#define eps 1e-6
using namespace std;
int n,m;
struct node
{
    double x,y;
}l[201];
struct lx
{
    int v;
    double d;
};
vector<lx> g[201];
void SPFA(int start)
{
    double dis[201];
    bool vis[201];
    for(int i=1;i<=n;i++)
        dis[i]=INF,vis[i]=0;
    queue<int>q;
    dis[start]=0,vis[start]=1;
    q.push(start);
    while(!q.empty())
    {
        int u=q.front();q.pop();
        vis[u]=0;
        for(int j=0;j<g[u].size();j++)
        {
            int v=g[u][j].v;
            double d=g[u][j].d;
            if(dis[v]>max(dis[u],d))
            {
                dis[v]=max(dis[u],d);
                if(!vis[v])
                {
                    vis[v]=1;
                    q.push(v);
                }
            }
        }
    }
    printf("Scenario #%d\nFrog Distance = %.3f\n\n",m++,dis[2]);
}
int main()
{
    m=1;
    while(scanf("%d",&n),n)
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%lf%lf",&l[i].x,&l[i].y);
            g[i].clear();
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                double d=sqrt(pow(l[i].x-l[j].x,2)+pow(l[i].y-l[j].y,2));
                lx now;
                now.d=d;
                now.v=j;g[i].push_back(now);
                now.v=i;g[j].push_back(now);
            }
        }
        SPFA(1);

    }
}




Dijkstra:


#include <cstdio>
#include <cmath>
#include <algorithm>
#define inf 0x7ffffff
#define MAXV 210
using namespace std;
struct lx
{
    double x,y;
} point[MAXV];
double d[MAXV];
int n;
void dijkstra()
{
    int i,j,vis[MAXV],v=1;
    double min;
    for(i=1; i<=n; i++)
    {
        d[i]=inf;
        vis[i]=0;
    }
    d[1]=0;
    for(i=1; i<=n; i++)
    {
        min=inf;
        for(j=1; j<=n; j++)
            if(!vis[j] && d[j]<min)
            {
                min=d[j];
                v=j;
            }
        vis[v]=1;
        if(v==2) break;
        for(j=1; j<=n; j++)
        {
            double len=sqrt(pow(point[v].x-point[j].x,2)+pow(point[v].y-point[j].y,2));
            if(!vis[j] && d[j]>max(d[v],len))
            {
                d[j]=max(d[v],len);
            }
        }
    }
}
int main()
{
    int i,cnt=1;
    while(scanf("%d",&n) ,n)
    {
        for(i=1; i<=n; i++) scanf("%lf%lf",&point[i].x,&point[i].y);
        dijkstra();
        printf("Scenario #%d\nFrog Distance = %.3lf\n\n",cnt++,d[2]);
    }
    return 0;
}



Kruskal:


#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<cmath>
#define INF 0x7fffffff
#define eps 1e-6
using namespace std;
int n,m;
int fa[201];
struct lx
{
    double x,y;
}point[201];
struct edge
{
    int u,v;
    double len;
}l[20101];
int father(int x)
{
    if(x!=fa[x])
        fa[x]=father(fa[x]);
    return fa[x];
}
bool cmp(edge a,edge b)
{
    return a.len<b.len;
}
int main()
{
    int m=1;
    while(scanf("%d",&n),n)
    {
        for(int i=1;i<=n;i++)
            scanf("%lf%lf",&point[i].x,&point[i].y);
        for(int i=1;i<=n;i++)
            fa[i]=i;
        int edgecot=0;
        for(int i=1;i<=n;i++)
            for(int j=i+1;j<=n;j++)
        {
            l[edgecot].u=i;
            l[edgecot].v=j;
            l[edgecot++].len=sqrt(pow(point[i].x-point[j].x,2)+pow(point[i].y-point[j].y,2));
        }
        sort(l,l+edgecot,cmp);
        double ans=0;
        for(int i=0;i<edgecot;i++)
        {
            int x=l[i].u;
            int y=l[i].v;
            double len=l[i].len;
            int fx=father(x);
            int fy=father(y);
            if(fx==fy)continue;
            fa[fy]=fx;
            if(father(1)==father(2))
            {
                ans=len;break;
            }

        }
        printf("Scenario #%d\nFrog Distance = %.3f\n\n",m++,ans);
    }

}