zoukankan      html  css  js  c++  java
  • POJ 2253 Frogger

    题意比较难搞懂。实际上就是求到‘2’点的 最小的最大值。说明白点就是:从‘1’到‘2’有多条路,每一条路中肯定有一条最大的边,求的是所有路中最大边最小的那个值。

    可以用dij或者spfa搞,松弛操作都一样的。也可以用弗洛伊德,都差不多。下面只贴前两个

    spfa:

    #include<stdio.h>
    #include<string.h>
    #include<cstring>
    #include<string>
    #include<math.h>
    #include<queue>
    #include<algorithm>
    #include<iostream>
    #include<stdlib.h>
    #include<cmath>
    
    #define INF 0x3f3f3f3f
    #define MAX 100005
    
    using namespace std;
    
    struct node
    {
        int u,v,next;
        double w;
    }Map[MAX];
    
    int n,vis[MAX],x[MAX],y[MAX],k,a[MAX];
    double dist[MAX];
    
    void Init()
    {
        memset(vis,0,sizeof(vis));
    
        for(int i=0;i<MAX;i++)
            {
                a[i]=-1;
                dist[i]=INF;
            }
    }
    
    void Add(int u,int v,double w)
    {
        Map[k].u=u;
        Map[k].v=v;
        Map[k].w=w;
        Map[k].next=a[u];
    
        a[u]=k++;
    }
    
    void spfa()
    {
        queue<int>Q;
        int start=1,i;
        dist[1]=0;
        vis[1]=1;
        Q.push(start);
    
        while(!Q.empty())
        {
            start=Q.front();
            Q.pop();
            vis[start]=0;
    
            for(i=a[start];i!=-1;i=Map[i].next)
            {
                int v=Map[i].v;
    
                if(dist[v] > dist[start] && dist[v] > Map[i].w)//松弛操作
                {
                    dist[v]=max(dist[start],Map[i].w);
    
                    if(!vis[v])
                    {
                        vis[v]=1;
                        Q.push(v);
                    }
                }
            }
        }
    }
    
    int main()
    {
        int i,j,cas=1;
    
        while(scanf("%d",&n),n)
        {
            Init();
    
            for(i=1;i<=n;i++)
            {
                scanf("%d%d",&x[i],&y[i]);
            }
    
            for(i=1;i<=n;i++)
            {
                for(j=i;j<=n;j++)
                {
                    double num=sqrt((x[i]-x[j])*(x[i]-x[j])*1.0 + (y[i]-y[j])*(y[i]-y[j])*1.0);
                    Add(i,j,num);
                    Add(j,i,num);
                }
            }
    
            spfa();
    
            printf("Scenario #%d
    ",cas++);
            printf("Frog Distance = %.3f
    
    ",dist[2]);
        }
        return 0;
    }
    

      



    dij:
    #include<stdio.h>
    #include<string.h>
    #include<cstring>
    #include<string>
    #include<math.h>
    #include<queue>
    #include<algorithm>
    #include<iostream>
    #include<stdlib.h>
    #include<cmath>
    
    #define INF 0x3f3f3f3f
    #define MAX 1005
    
    using namespace std;
    
    double dist[MAX],Map[MAX][MAX];
    
    int vis[MAX],n;
    
    double dij()
    {
        memset(vis,0,sizeof(vis));
    
        int i,j,k,minn;
    
        for(i=2;i<=n;i++)
            dist[i]=Map[1][i];
    
        vis[1]=1;
    
        for(i=1;i<n;i++)
        {
            minn=INF;
    
            for(j=1;j<=n;j++)
            {
                if(minn > dist[j] && !vis[j])
                {
                    k=j;
                    minn=dist[j];
                }
            }
    
            vis[k]=1;
    
            for(j=1;j<=n;j++)
            {
                if(!vis[j] && dist[j] > dist[k] && dist[j] > Map[k][j])
                {
                    dist[j]=max(dist[k],Map[k][j]);
                }
            }
        }
    
        return dist[2];
    }
    
    int main()
    {
        int x[MAX],y[MAX],cas=1,i,j;
    
        while(scanf("%d",&n),n)
        {
            for(i=0;i<MAX;i++)
            for(j=0;j<MAX;j++)
            Map[i][j]=INF;
    
            for(i=1;i<=n;i++)
            {
                scanf("%d%d",&x[i],&y[i]);
            }
    
            for(i=1;i<=n;i++)
            {
                for(j=i+1;j<=n;j++)
                {
                    double k=sqrt((x[i]-x[j])*(x[i]-x[j])*1.0 + (y[i]-y[j])*(y[i]-y[j])*1.0);
    
                    Map[i][j]=Map[j][i]=k;
                }
            }
    
            double ans=dij();
    
            printf("Scenario #%d
    ",cas++);
    
            printf("Frog Distance = %.3f
    
    ",ans);
        }
        return 0;
    }
    

      

     
  • 相关阅读:
    求最长不降子序列

    普通背包问题
    求最大子序列
    最大人品
    C# 显示webBrowser页面加载进度
    Provider 错误 '80004005' 未指定的错误 的最终解决方法
    C# 截取webBrowser网页存为图片
    浅谈Python小数据池
    js文件编译成动态链接库(dll)文件
  • 原文地址:https://www.cnblogs.com/alan-W/p/5664089.html
Copyright © 2011-2022 走看看