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
  • 相关阅读:
    createDocumentFragment 文档碎片提升dom增删的性能
    微信小程序引入外部js 方法
    javascript 阻止事件冒泡 cancelBubble
    javascript event事件兼容性处理
    SVN地址正确,能在网页打开,但是检出失败解决方法
    使用a标签下载文件,而不是直接打开,使用属性 download
    java 获取项目根目录
    ajax 提交所有表单内容及上传图片(文件),以及单独上传某个图片(文件)
    Vim命令图解和XVim使用
    解决MWPhotoBrowser中的SDWebImage加载大图导致的内存警告问题
  • 原文地址:https://www.cnblogs.com/skyming/p/2479551.html
Copyright © 2011-2022 走看看