• 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
  • 相关阅读:
    微信小程序创建第一个项目
    微信小程序工具下载与安装
    Windows下删除顽固文件夹
    微信小程序账号注册
    C++第四十九篇 -- 将一个项目Copy到另一台电脑
    C++第四十八篇 -- 字符串分离方法
    C++第四十七篇 -- VS2017带参数启动调试程序
    MarkDown插入图片
    Http升级到Https (本地测试,无须域名和认证)
    语音识别(ASR) 阿里云
  • 原文地址:https://www.cnblogs.com/skyming/p/2479551.html
Copyright © 2020-2023  润新知