首页 > 其他 > 详细

L3-005. 垃圾箱分布

时间:2018-03-19 22:59:29      阅读:285      评论:0      收藏:0      [点我收藏+]

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

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

输入格式:

输入第一行给出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


题意有点坑,一共最多1000人,数据不算大,对每个位置都进行dijkstra,然后进行筛选。
代码:
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
/*输入第一行给出4个正整数:N(<= 103)是居民点的个数;M(<= 10)是垃圾箱候选地点的个数;K(<= 104)是居民点和垃圾箱候选地点之间的
道路的条数;DS是居民点与垃圾箱之间不能超过的最大距离。所有的居民点从1到N编号,所有的垃圾箱候选地点从G1到GM编号。
随后K行,每行按下列格式描述一条道路:
P1 P2 Dist
其中P1和P2是道路两端点的编号,端点可以是居民点,也可以是垃圾箱候选点。Dist是道路的长度,是一个正整数。
int n,m,k,ds;
*/
int n,m,k,ds,dist,g;
double mdis,adis;
int mp[1020][1020];
int dis[1020],visited[1020];
int main()
{
    char s1[10],s2[10];
    cin>>n>>m>>k>>ds;
    memset(mp,inf,sizeof(mp));
    for(int i = 0;i < k;i ++)
    {
        cin>>s1>>s2>>dist;
        int x = s1[0] == G ? atoi(s1 + 1) + n : atoi(s1);///下次注意 别再用s1[1] - ‘0‘,不一定是一位数
        int y = s2[0] == G ? atoi(s2 + 1) + n : atoi(s2);
        mp[x][y] = mp[y][x] = dist;
    }
    for(int i = 1;i <= m;i ++)
    {
        int c = 0;///计算一共记录几个人
        memset(dis,inf,sizeof(dis));///
        memset(visited,0,sizeof(visited));///初始化
        dis[i + n] = 0;
        double mdi = inf,adi = 0;///mdi记录最小距离 adi记录总的距离和
        for(int j = 1;j <= n + m;j ++)
        {
            int u = inf;
            for(int k = 1;k <= n + m;k ++)
            {
                if(visited[k])continue;
                if(u == inf || dis[k] < dis[u])u = k;
            }
            if(u == inf)break;
            visited[u] = 1;
            if(u <= n)
            {
                if(dis[u] > ds)
                {
                    break;
                }
                c ++;
                adi += dis[u];
                if(dis[u] < mdi)mdi = dis[u];
            }
            for(int k = 1;k <= n + m;k ++)
            {
                if(visited[k])continue;
                if(dis[u] + mp[u][k] < dis[k])dis[k] = dis[u] + mp[u][k];
            }
        }
        if(c == n)
        {
            if(mdis < mdi)g = i,mdis = mdi,adis = adi;
            else if(mdis == mdi)
            {
                if(adis > adi)g = i,adis = adi;
            }
        }
    }
    if(g)printf("G%d\n%.1f %.1f",g,mdis,adis / n);
    else printf("No Solution");
}

 

L3-005. 垃圾箱分布

原文:https://www.cnblogs.com/8023spz/p/8605678.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!