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;
}
posted @ 2012-05-02 20:52  skyming  阅读(367)  评论(0编辑  收藏  举报