poj 2253 Frogger (哈哈~~有点意思)

练练手吧~~~-->__<--

关键点:dist[v]=min(dist[v],max(dist[u],cost[i]));

spfa

#include<stdio.h>

#include<string.h>

#include<algorithm>

using namespace std;

#include<math.h>

#define N 210

#define inf 999999999



struct node

{

    int x,y;

}point[N*N];



int n,m,head[N],e;

int pnt[N*N],nxt[N*N];

double cost[N*N];



void add(int u,int v,double c)

{

    pnt[e]=v;cost[e]=c;nxt[e]=head[u];head[u]=e++;

}

double spfa(int s)

{

    double dist[N];int vis[N];

    for(int i=0;i<n;i++)

    dist[i]=inf,vis[i]=0;

    dist[s]=0; vis[s]=1;

    

    int q[N*N],top=1; q[0]=s;

    while(top)

    {

        int u=q[--top];vis[u]=0;

        for(int i=head[u];i!=-1;i=nxt[i])

        {

            int v=pnt[i];

            if(dist[v]>max(dist[u],cost[i]))

            {

                dist[v]=max(dist[u],cost[i]);

                if(!vis[v])

                {

                    vis[v]=1;

                    q[top++]=v;

                }

            }

        }

    }

    return dist[1];

}

double dis(node p,node q)

{

    return sqrt((p.x-q.x)*(p.x-q.x)+(p.y-q.y)*(p.y-q.y));

}

int main()

{

    int cs=1;

    while(scanf("%d",&n),n)

    {

        e=0;

        memset(head,-1,sizeof(head));

        for(int i = 0;i < n;i ++)

        {

            scanf("%d%d",&point[i].x,&point[i].y);

            for(int j=0;j<i;j++)

            {

               add(i,j,dis(point[i],point[j]));

               add(j,i,dis(point[i],point[j]));

            }

        }

        printf("Scenario #%d\n",cs++);

        printf("Frog Distance = %.3f\n\n", spfa(0));

    }

    return 0;

}

prim +dij +floyd

#include<stdio.h>

#include<string.h>

#include<math.h>

#define N 210

#define inf 999999999

struct node

{

    int x,y;

}point[N*N];

double max(double a,double b)

{

    return a>b? a:b;

}

double map[N][N];

int n,m;

double prim()

{

    int vis[N];double dist[N];

    for(int i=0;i<n;i++) dist[i]=map[0][i];

    memset(vis,0,sizeof(vis));

    vis[0]=1;dist[0]=0;

    double cnt=0;

    for(int i=1;i<n;i++)

     {

         double min=inf;int pos=0;

         for(int j=0;j<n;j++)

         {

             if(!vis[j]&&dist[j]<min)

             {

                 min=dist[j];pos=j;

             }

         }

         if(cnt < min) cnt=min;

         if(pos==1)  break;

         vis[pos]=1;

         for(int j=0;j<n;j++)

         {

             if(!vis[j]&&dist[j]>map[pos][j])

             dist[j]=map[pos][j];

         }

     }

     return cnt;

}

double dij()

{

    int vis[N];double dist[N];

    for(int i=0;i<n;i++) dist[i]=map[0][i];

    memset(vis,0,sizeof(vis));

    vis[0]=1;dist[0]=0;



    for(int i=1;i<n;i++)

     {

         double min=inf;int pos=0;

         for(int j=0;j<n;j++)

         {

             if(!vis[j]&&dist[j]<min)

             {

                 min=dist[j];pos=j;

             }

         }

         if(pos==1)  break;

         vis[pos]=1;

         for(int j=0;j<n;j++)

         {

             if(!vis[j]&&dist[j]>max(map[pos][j],dist[pos]))

             dist[j]=max(map[pos][j],dist[pos]);

         }

     }

     return dist[1];

}

double dis(node p,node q)

{

    return sqrt((p.x-q.x)*(p.x-q.x)+(p.y-q.y)*(p.y-q.y));

}



void floyd()

{

    for(int k=0;k<n;k++)

     for(int i=0;i<n;i++)

      for(int j=0;j<n;j++)

      {

          if(map[i][j] > max(map[i][k],map[k][j]) )

          map[i][j]=max(map[i][k],map[k][j]);

      }

}

int main()

{

    int cs=1;

    while(scanf("%d",&n),n)

    {

        for(int i = 0;i < n;i ++)

        {

            scanf("%d%d",&point[i].x,&point[i].y);

            for(int j=0;j<i;j++)

            map[i][j] =map[j][i]=dis(point[i],point[j]);

        }

        printf("Scenario #%d\n",cs++);

        printf("Frog Distance = %.3f\n\n", dij());

    }

    return 0;

}

你可能感兴趣的:(poj)