L3-005. 垃圾箱分布

时间限制
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
 

刚开始题目意思比较难理解:“选在到所有居民点的最短距离最长的地方”。首先知道题目中对答案的限制条件只有一个,那就是最大距离不能超过Ds,那么对在此基础上筛选下来的候选位置中计算他们各自的到所有居民区的最短距离,比如我G1到1号1米,2号2米,3号3米;G2到1号6米,到2号5米,到3号10米,那么G1的最短就是1米(一号),G2的最短距离就是5米(二号)。

以此类推对每一个筛选出来的候选位置都计算对应的min_dx。然后当然此前要对筛选出来的答案存放到数组,然后排序一下。这题比较杯具的是交了N多次,刚开始是用map写邻接表,超时,改为vector,终于不超时了,可是总是最后一个组WA,不解,接着改啊改……WA数次之后发现是自定义排序规则里一个变量写错了。真的是无语了。原本还以为这题的坑点是不一定1~N的所有点和垃圾桶位置,还搞了个set存放位置,现在看来题目还是比较友好的……

代码:

#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<string>
#include<deque>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define MM(x) memset(x,0,sizeof(x))
using namespace std;
typedef long long LL;
const int N=10020;
typedef pair<int,double> psd;
vector<psd>E[1050];
double d[N];
int n,m,k;
double ds;
inline int bianhao(char s[])
{
int len=strlen(s);
int r=0;
if(s[0]=='G')
{
for (int i=1; i<len; i++)
r=r*10+(s[i]-'0');
return 1000+r;
}
else
{ for (int i=0; i<len; i++)
r=r*10+(s[i]-'0');
return r;
}
}
inline void spfa(const int &s,const int &t)
{
d[s]=0;
priority_queue<pair<double,int> >Q;
Q.push(pair<double,int>(-d[s],s));
while (!Q.empty())
{
int now=Q.top().second;
Q.pop();
for (int i=0; i<E[now].size(); i++)
{
int v=E[now][i].first;
if(d[v]>d[now]+E[now][i].second)
{
d[v]=d[now]+E[now][i].second;
Q.push(pair<double,int>(-d[v],v));
}
}
}
}
struct info
{
int s;
double aver,sum,minm;
info(const int &ss,const double &av,const double &su,const double &mm):s(ss),aver(av),sum(su),minm(mm){}
info(){}
};
bool cmp(const info &a,const info &b)
{
if(a.minm!=b.minm)
return a.minm>b.minm;//就是这个地方写成了a.minm>b.sum,强行WA数次- -
if(a.aver!=b.aver)
return a.aver<b.aver;
else
return a.s<b.s;
}
int main(void)
{
int i,j;
while (~scanf("%d%d%d%lf",&n,&m,&k,&ds))
{
for (i=0; i<1050; i++)
E[i].clear();
char s[5],t[5];
int S,T;
double dx;
for (i=0; i<k; i++)
{
scanf("%s%s%lf",s,t,&dx);
S=bianhao(s);
T=bianhao(t);
E[S].push_back(psd(T,dx));
E[T].push_back(psd(S,dx));
}
info ans[1000];int cnt=0;
for (i=1; i<=m; i++)
{
memset(d,0x43,sizeof(d));
for (j=1; j<=n; j++)
spfa(i+1000,j);
bool flag=1;
double sss=0,tj,mm=1e6;
for (j=1; j<=n; j++)
{
tj=d[j];
if(tj>ds)
{
flag=0;
break;
}
sss+=tj;
if(tj<mm)
mm=tj;
}
if(flag)
ans[cnt++]=info(i,sss/n,sss,mm);
}
if(cnt==0)
puts("No Solution");
else
{
sort(ans,ans+cnt,cmp);
printf("G%d\n%.1lf %.1lf\n",ans[0].s,ans[0].minm,ans[0].aver);
}
}
return 0;
}

PAT天梯赛练习题——L3-005. 垃圾箱分布(暴力SPFA)的更多相关文章

  1. PAT天梯赛练习题 L3-011. 直捣黄龙(多关键字SPFA+DFS)

    L3-011. 直捣黄龙 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题是一部战争大片 —— 你需要从己方大本营出发,一路 ...

  2. PAT天梯赛练习题——L3-007. 天梯地图(多边权SPFA)

    L3-007. 天梯地图 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校 ...

  3. PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)

    L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...

  4. PAT天梯赛练习题 L3-002. 堆栈(线段树查询第K大值或主席树)

    L3-002. 堆栈 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家都知道“堆栈”是一种“先进后出”的线性结构,基本操作有 ...

  5. PAT天梯赛练习题 L2-013 红色警报(并查集+逆序加边)

    L2-013. 红色警报 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 战争中保持各个城市间的连通性非常重要.本题要求你编写一 ...

  6. PAT天梯赛练习题——L3-004. 肿瘤诊断(三维连通块并查集)

    L3-004. 肿瘤诊断 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 在诊断肿瘤疾病时,计算肿瘤体积是很重要的一环.给定病灶 ...

  7. PAT天梯赛练习题——L3-003. 社交集群(并查集按秩合并)

    L3-003. 社交集群 时间限制 1000 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 在社交网络平台注册时,用户通常会输入自己的兴趣爱好, ...

  8. PAT天梯赛练习题——L3-008. 喊山(邻接表+BFS)

    L3-008. 喊山 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 喊山,是人双手围在嘴边成喇叭状,对着远方高山发出“喂—喂喂 ...

  9. PAT天梯赛 L1-049 天梯赛座位分配

    题目链接:点击打开链接 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] ...

随机推荐

  1. 关于Retrofit + RxJava 的使用

    年前一个月到现在,一直都在忙一个项目.项目使用的三方框架还是蛮多的. 下面来总结一下自己使用Retrofit + RxJava的知识点吧. (以下讲述从一个请求的最初开始) 1.首先定义一个RxMan ...

  2. uvm_reg——寄存器模型(三)

    uvm_reg 是uvm_reg_field , 包含所有uvm_reg_field 所有的函数.

  3. “chm 已取消到该网页的导航”解决方案

    1. 右键单击该 CHM 文件,然后单击“属性”. 2. 单击“取消阻止”或者“解除锁定”. 3. 双击此 .chm 文件以打开此文件.

  4. ubuntu 16.04 国内源安装docker

    1. 通过curl命令安装 检查是否安装curl root@ros-OptiPlex-3050:~# which curlroot@ros-OptiPlex-3050:~# 更新安装 root@ros ...

  5. ubuntu 14.04 构建openstack使用的ubunt 16 的桌面版的使用镜像

    1. 下载ubuntu 16.04桌面版的iso文件,我的个人网盘中有,可以下载 https://pan.baidu.com/s/14qT3lbbqLwDaejmz2VSkyw 2. 安装制作镜像文件 ...

  6. 系统相册中获取gif图片 保证取到的图片不会改变

    NSURL *imageRefURL = [info valueForKey:UIImagePickerControllerReferenceURL];                         ...

  7. Java-NestedClass(Interface).

    内部类(Nested Class) 内部类:即在一个类中还包含着另外一个类,一般是作为匿名类或者是使用数据隐藏时使用的.例子: //内部类 class Out{ private int age = 1 ...

  8. linux_1

    注: 创建软连接: "ln -s xxx 路径1" 在路径1创建xxx的软连接 特点: 1.文件类型 l 2.相当于windows的快捷方式 创建硬链接: "ln xxx ...

  9. Linux内核漏洞利用-环境配置(转)

    实验环境: Ubuntu-14.04.1 x86 linux-2.6.32.1 busybox-1.27.2 qemu 0x00 安装qemu sudo apt-get install qemu qe ...

  10. 监控linux各主机系统时间是否一致

    #!/bin/bashSTATE_OK=0 STATE_WARNING=1 STATE_CRITICAL=2 STATE_UNKNOWN=3PASSWD='**************'print_h ...