zoukankan      html  css  js  c++  java
  • PAT 垃圾箱分布(30分)dijstra

    垃圾箱分布

    时间限制
    200 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard
    作者
    陈越

    大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾箱住。所以垃圾箱的位置必须选在到所有居民点的最短距离最长的地方,同时还要保证每个居民点都在距离它一个不太远的范围内。

    现给定一个居民区的地图,以及若干垃圾箱的候选地点,请你推荐最合适的地点。如果解不唯一,则输出到所有居民点的平均距离最短的那个解。如果这样的解还是不唯一,则输出编号最小的地点。

    输入格式:

    输入第一行给出4个正整数:N(<= 103)是居民点的个数;M(<= 10)是垃圾箱候选地点的个数;K(<= 104)是居民点和垃圾箱候选地点之间的道路的条数;DS是居民点与垃圾箱之间不能超过的最大距离。所有的居民点从1到N编号,所有的垃圾箱候选地点从G1到GM编号。

    随后K行,每行按下列格式描述一条道路:
    P1 P2 Dist
    其中P1和P2是道路两端点的编号,端点可以是居民点,也可以是垃圾箱候选点。Dist是道路的长度,是一个正整数。

    输出格式:

    首先在第一行输出最佳候选地点的编号。然后在第二行输出该地点到所有居民点的最小距离和平均距离。数字间以空格分隔,保留小数点后1位。如果解不存在,则输出“No Solution”。

    输入样例1:
    4 3 11 5
    1 2 2
    1 4 2
    1 G1 4
    1 G2 3
    2 3 2
    2 G2 1
    3 4 2
    3 G3 2
    4 G1 3
    G2 G1 1
    G3 G2 2
    
    输出样例1:
    G1
    2.0 3.3
    
    输入样例2:
    2 1 2 10
    1 G1 9
    2 G1 20
    
    输出样例2:
    No Solution
    

     详见代码,dijstra

    #include <iostream>
    #include <cstring>
    #include <string>
    #include <algorithm>
    #define inf 0x3f3f3f3f
    using namespace std;
    int n,k,m,ds;
    int e[1205][1205];
    bool v[1205];
    int d[1205];
    int kk=1;
    struct node
    {
        int bh;
        double p;
        int h;
        int zd;
    }a[15];
    bool cmp(node x,node y)
    {
        if(x.zd==y.zd)
        {
            if(x.p==y.p)
                return x.bh<y.bh;
            else return x.p<y.p;
        }
        else return x.zd>y.zd;//最短距离要最长
    }
    void dijstra(int s)
    {
        int i;
        memset(v,0,sizeof(v));
        v[s]=1;
        int zd=inf;
        for(i=1;i<=n+m;i++) 
        {
            d[i]=e[s][i];
            if(!v[i]&&i<=n&&d[i]<zd)//条件要写全
                zd=d[i];
        }
        while(1)
        {
            int k=-1;
            int mm=inf;
            for(i=1;i<=n+m;i++)
            {
                if(!v[i]&&d[i]<mm)
                {
                    k=i;
                    mm=d[i];
                }
            }
            if(k==-1) break;
            v[k]=1;
            for(i=1;i<=n+m;i++)
            {
                if(d[i]>d[k]+e[k][i])
                {
                    d[i]=d[k]+e[k][i];
                    if(!v[i]&&i<=n&&d[i]<zd)
                        zd=d[i];//把最短的距离找出来
                }
            }
        }
        int ss=0;
        for(i=1;i<=n;i++)
        {
            if(d[i]>ds) break;//最短路径超出范围的不要
            else ss+=d[i];
        }
        if(i==n+1)
        {
            a[kk].bh =s-n;
            a[kk].h=ss;
            a[kk].zd=zd;
            a[kk++].p=ss*1.0/n;
        }
    }
    
    int main()
    {
       cin>>n>>m>>k>>ds;
       int i,j;
       for(i=1;i<=n+m;i++)
           for(j=1;j<=n+m;j++)
           {
               if(i==j) e[i][j]=0;
               else e[i][j]=inf;
           }
       for(i=1;i<=k;i++)
       {
           string a,b;//G的处理
           int z;
           cin>>a>>b>>z;
           int x=0,y=0;
           if(a[0]!='G') 
           {
               int l=a.length ();
               for(int i=0;i<l;i++)
               {
                   x=x*10+a[i]-'0';
               }
           }
           else 
           {
              int l=a.length ();
               for(int i=1;i<l;i++)
               {
                   x=x*10+a[i]-'0';
               }
                x+=n;
           }
    
           if(b[0]!='G') 
           {
                int l=b.length ();
               for(int i=0;i<l;i++)
               {
                   y=y*10+b[i]-'0';
               }
           }
           else 
           {
               int l=b.length ();
               for(int i=1;i<l;i++)
               {
                   y=y*10+b[i]-'0';
               }
               y+=n;
           }
           if(e[x][y]>z)
           {
               e[x][y]=z;
               e[y][x]=z;
           }
       }
       for(int i=n+1;i<=m+n;i++)//遍历每一个垃圾箱
       {
           dijstra(i);
       }
       if(k==1) cout<<"No Solution";
       else
       {
           sort(a+1,a+kk,cmp);//排个序,是kk
           if(a[1].bh==0)  cout<<"No Solution";
           else
           {
               cout<<"G"<<a[1].bh<<endl;
                printf("%.1lf",a[1].zd*1.0);cout<<" ";
               printf("%.1lf",a[1].p);
           }
       }
    
       return 0;
    }
  • 相关阅读:
    typeid抛出异常的解释
    [原创]公平数的解法
    [原创]我的北大ACM POJ 1012解答
    [原创]我的PKU ACM POJ1029题解
    asp.net 单用户登录经典解决方案
    [转]SQL事务回滚的问题及其解决的方法
    获取json数据
    js中Date对象的用法
    解决刷新后回到顶部的问题
    C#获取客户端及服务器端主机信息
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/13271105.html
Copyright © 2011-2022 走看看