zoukankan      html  css  js  c++  java
  • 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;
    }
    Just a little, maybe change the world
  • 相关阅读:
    JS获当前网页元素高度offsetHeight
    C-LODOP回调多个返回值On_Return_Remain
    JS的slice、substring、substr字符串截取
    【JS新手教程】JS修改css样式的几种方法
    Unity GUI(uGUI)使用心得与性能总结
    PDB文件:每个开发人员都必须知道的
    IEnumerable 使用foreach 详解
    Unity------Unity 脚本基类 MonoBehaviour 与 GameObject 的关系
    Unity5-----------之GI设置简介
    unity5x --------Music Mixer参数详解
  • 原文地址:https://www.cnblogs.com/skyming/p/2479551.html
Copyright © 2011-2022 走看看