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

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

输入格式:

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

题目大意:从m个垃圾站里面选取1个站点,让他离居民区的最近的人最远,并且没有超出服务范围ds之内。如果有很多个最远的垃圾站,输出距离所有居民区距离平均值最小的那个。如果平均值还是一样,就输出按照顺序排列垃圾站编号最小的那个~

分析:

因为垃圾站之间也是彼此有路连接的,所以最短路径计算的时候也要把垃圾站算上。所以我们就是堆n+m个点进行Dijkstra计算最短路径。要求计算出1~m号垃圾站距离其他站点的最短路径。这时候可以遍历dis数组,如果dis存在一个距离大于服务范围ds的距离,那么我们就舍弃这个垃圾站。取最最短的路径,这就是距离它最近的垃圾站mindis。如果mindis > ansdis,就是说找到了一个距离居民最小距离的垃圾站是更远的,那就选这个垃圾站,更新ansid为它的id。最后输出~

对于垃圾站的字符串编号的处理:如果最近居民区最大的值没有变化但是找到了一个更小的平均距离,那就选这个。我们可以根据输入的是G还是数字,如果是数字就令编号为他自己,如果是G开头的,编号设为n+G后面的数字

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
const int inf = 999999999;
int n, m, k, ds, station;
int e[1020][1020], dis[1020];
bool visit[1020];
int main() {fill(e[0], e[0] + 1020 * 1020, inf);fill(dis, dis + 1020, inf);scanf("%d%d%d%d", &n, &m, &k, &ds);for(int i = 0; i < k; i++) {int tempdis;string s, t;cin >> s >> t >> tempdis;int a, b;if(s[0] == 'G') {s = s.substr(1);a = n + stoi(s);} else {a = stoi(s);}if(t[0] == 'G') {t = t.substr(1);b = n + stoi(t);} else {b = stoi(t);}e[a][b] = tempdis;e[b][a] = tempdis;}int ansid = -1;double ansdis = -1, ansaver = inf;for(int index = n + 1; index <= n + m; index++) {double mindis = inf, aver = 0;fill(dis, dis + 1020, inf);fill(visit, visit + 1020, false);dis[index] = 0;for(int i = 0; i < n + m; i++) {int u = -1, minn = inf;for(int j = 1; j <= n + m; j++) {if(visit[j] == false && dis[j] < minn) {u = j;minn = dis[j];}}if(u == -1) break;visit[u] = true;for(int v = 1; v <= n + m; v++) {if(visit[v] == false && dis[v] > dis[u] + e[u][v])dis[v] = dis[u] + e[u][v];}}for(int i = 1; i <= n; i++) {if(dis[i] > ds) {mindis = -1;break;}if(dis[i] < mindis) mindis = dis[i];aver += 1.0 * dis[i];}if(mindis == -1) continue;aver = aver / n;if(mindis > ansdis) {ansid = index;ansdis = mindis;ansaver = aver;} else if(mindis == ansdis && aver < ansaver) {ansid = index;ansaver = aver;}}if(ansid == -1)printf("No Solution");else {printf("G%d\n", ansid - n);printf("%.1f %.1f", ansdis, ansaver);}return 0;
}

L3-005. 垃圾箱分布-PAT团体程序设计天梯赛GPLT(Dijkstra)相关推荐

  1. L2-005 集合相似度-PAT团体程序设计天梯赛GPLT

    题目来源:团体程序设计天梯赛-练习集 题目地址:L2-005 集合相似度 题目大意 给定 nnn 个集合,然后有 kkk 次询问,每次询问都要求出 Nc/Nt×100%N_c / N_t \times ...

  2. L1-079 天梯赛的善良 (20 分)-PAT 团体程序设计天梯赛 GPLT

    天梯赛是个善良的比赛.善良的命题组希望将题目难度控制在一个范围内,使得每个参赛的学生都有能做出来的题目,并且最厉害的学生也要非常努力才有可能得到高分. 于是命题组首先将编程能力划分成了 106个等级( ...

  3. L1-078 吉老师的回归 (15 分)-PAT 团体程序设计天梯赛 GPLT

    曾经在天梯赛大杀四方的吉老师决定回归天梯赛赛场啦! 为了简化题目,我们不妨假设天梯赛的每道题目可以用一个不超过 500 的.只包括可打印符号的字符串描述出来,如:Problem A: Print &q ...

  4. [Python] L1-052 2018我们要赢-PAT团体程序设计天梯赛GPLT

    2018年天梯赛的注册邀请码是"2018wmyy",意思就是"2018我们要赢".本题就请你用汉语拼音输出这句话. 输入格式: 本题没有输入. 输出格式: 在第 ...

  5. L1-052 2018我们要赢-PAT团体程序设计天梯赛GPLT

    2018年天梯赛的注册邀请码是"2018wmyy",意思就是"2018我们要赢".本题就请你用汉语拼音输出这句话. 输入格式: 本题没有输入. 输出格式: 在第 ...

  6. L3-007. 天梯地图-PAT团体程序设计天梯赛GPLT

    本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至少存在一条可达路线. 输 ...

  7. L3-011 直捣黄龙 (30 分)-PAT 团体程序设计天梯赛 GPLT

    本题是一部战争大片 -- 你需要从己方大本营出发,一路攻城略地杀到敌方大本营.首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营.当这样的路径不唯一时,要求选择可以沿途解放最多城镇 ...

  8. [Python] L1-045 宇宙无敌大招呼-PAT团体程序设计天梯赛GPLT

    据说所有程序员学习的第一个程序都是在屏幕上输出一句"Hello World",跟这个世界打个招呼.作为天梯赛中的程序员,你写的程序得高级一点,要能跟任意指定的星球打招呼. 输入格式 ...

  9. [Python] L1-005. 考试座位号-PAT团体程序设计天梯赛GPLT

    L1-005. 考试座位号 每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位.正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号 ...

最新文章

  1. 协方差中的正相关与负相关 指的是线性代数中的线性相关
  2. perl---dbi,sqlite中文乱码
  3. 详解C中volatile关键字
  4. JLupin Next Server乍一看
  5. 完美数:数学宝库中的一颗璀璨明珠
  6. H3C服务器系统配置ip,H3C交换机DHCP 服务器动态分配地址典型配置指导
  7. 鼠标点击后的CSS3跑马灯效果
  8. 使用PHP对word文档进行操作的方法
  9. linux 编写shell管理脚本01。2
  10. vc6.0 debug 比 release 快??_全网稀缺的快应用开源项目熊宝儿歌故事QuickApp
  11. java小游戏源码_分享几款java小游戏源码
  12. [原创]K8_Delphi源码免杀系列教程
  13. windows-API劫持(API-HOOK)
  14. Java算法:经纬度转换 将百度转为高德经纬度
  15. 如何搭建个人网站(内容详细,适合新手)
  16. 【Flutter之旅】路由管理
  17. Scratch基础(四):演奏音乐-两只老虎
  18. Ubuntu完全教程,让你成为Ubuntu高手!
  19. 干活的干不过写PPT的 新东方年会吐槽奖金追加至12万-千氪
  20. 不懂这些高并发分布式架构、分布式系统的数据一致性解决方案,你如何能找到高新互联网工作呢?强势解析eBay BASE模式、去哪儿及蘑菇街分布式架构...

热门文章

  1. Linux下eclipse中shell脚本编程环境的搭建
  2. 转换jsonArray异常——由hibernate引起的转换jsonArray异常解决办法
  3. cas单点注销失败Error Sending message to url endpoint
  4. php 上传大文件主要涉及配置upload_max_filesize和post_max_size两个选项
  5. Sell yourself 1
  6. 如何阻止分布式拒绝服务***
  7. NSA和CISA联合发布《5G云基础设施安全保护指南》
  8. APACHE OFBIZ XML-RPC 反序列化漏洞 (CVE-2020-9496) 的复现与分析
  9. MoFi 路由器10个后门还剩4个未修复
  10. 成都睿铂 | 云南省地矿测绘院1:500地形免像控项目分享