【最短路+较复杂处理】PAT-L3-005. 垃圾箱分布
L3-005. 垃圾箱分布
大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾箱住。所以垃圾箱的位置必须选在到所有居民点的最短距离最长的地方【此处为第一重排序选择的条件】,同时还要保证每个居民点都在距离它一个不太远的范围内。
现给定一个居民区的地图,以及若干垃圾箱的候选地点,请你推荐最合适的地点。如果解不唯一,则输出到所有居民点的平均距离最短的那个解【此处为第二重排序的原则】。如果这样的解还是不唯一,则输出编号最小的地点【此处为第三重排序的原则,尽管遍历的时候是按顺序的,但sort排序的时候不是有序进行比较的(具体自己百度sort百度原理),所以比较加上这条!】。
输入格式:
输入第一行给出4个正整数:N(<= 103)是居民点的个数【在这里也WA了一次,因为编号是123的时候就需要来一个while循环进行字符串转数字了】;M(<= 10)是垃圾箱候选地点的个数;K(<= 104)是居民点和垃圾箱候选地点之间的道路的条数;DS是居民点与垃圾箱之间不能超过的最大距离【这里不用double来存贮其实也是可以过的,WA了第六遍的时候我以为是数据超int了需要用double来存,貌似是无用的】。所有的居民点从1到N编号,所有的垃圾箱候选地点从G1到GM编号。
随后K行,每行按下列格式描述一条道路:
P1 P2 Dist
其中P1和P2是道路两端点的编号,端点可以是居民点,也可以是垃圾箱候选点。Dist是道路的长度,是一个正整数。
输出格式:
首先在第一行输出最佳候选地点的编号。然后在第二行输出该地点到所有居民点的最小距离和平均距离。数字间以空格分隔,保留小数点后1位。如果解不存在,则输出“No Solution”。
AC代码:题目一般吧,细节仔细都能考虑到的。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<vector>
#include<string>
#include<stack>
#define inf 0x3f3f3f3f
#define dinf 0x7fffffff*1.0
using namespace std; //L3-005,垃圾箱,16:50--
#define N 1200
#define ll long long
struct node{
int x;
double d;
node(int x=,double d=0.0):x(x),d(d){}
};
struct node1{
int id;
double minn,ave;
node1(int id=,double minn=-,double ave=-):id(id),minn(minn),ave(ave){}
}ans[];
//1--到所有居民点的最短距离 相比较最长的地方,2-相等时,按平均距离最短的那个解
bool cmp(node1 a,node1 b){
if(fabs(a.minn-b.minn)<1e-){
if(fabs(a.ave-b.ave)<1e-)
return a.id<b.id;
else
return a.ave<b.ave;
}
else
return a.minn>b.minn;
}
vector<node>G[N];//垃圾箱就是把垃圾箱自身编号加上N
double dis[N];
int vis[N];
int n,m,k;
double ds;//一个阈值
int cnt;
void debug(int num){
printf("gar:%d--",num);double s=;
for(int i=;i<=n+m;i++){
s+=dis[i];
printf(" %.0lf",dis[i]);
}
cout<<" s: "<<s<<endl;
} void spfa(int ed){
queue<int>Q;
for(int i=;i<N;i++)
dis[i]=dinf;
memset(vis,,sizeof(vis));
Q.push(ed);
int u,v;
dis[ed]=0.0; while(Q.size()>){
u=Q.front();Q.pop();
vis[u]=;
for(int i=;i<(int)G[u].size();i++){
v=G[u][i].x;
if(dis[v]>dis[u]+G[u][i].d){
dis[v]=dis[u]+G[u][i].d;
if(!vis[v]){
Q.push(v);
vis[v]=;
}
}
}
}
double minn=dinf;
double sum=0.0;
for(int i=;i<=n;i++){
if(dis[i]>ds)return ;
sum+=dis[i];
minn=min(minn,dis[i]);
}
ans[++cnt]=node1(ed,minn,sum/(1.0*n) );
}
int fact(char ch[]){
int x=,i=;
if(ch[]=='G'){
i=;
}
while(ch[i]!='\0'){
x =x*+ch[i]-'' ;
i++;
}
if(ch[]=='G')x+=n;
return x;
}
int main(){
char ch1[],ch2[];
while(scanf("%d%d%d%lf",&n,&m,&k,&ds)!=EOF){
for(int i=;i<N;i++)
G[i].clear();
cnt=;//统计加入ans结构体的个数
int x,y;
double dist;
for(int i=;i<=k;i++){
scanf("%s%s%lf",ch1,ch2,&dist);
x=fact(ch1);
y=fact(ch2);
G[x].push_back(node(y,dist));
G[y].push_back(node(x,dist));
} for(int i=+n;i<=n+m;i++)
spfa(i);
if(cnt==){
printf("No Solution\n");
}
else{
sort(ans+,ans++cnt,cmp);
printf("G%d\n",ans[].id-n);
printf("%.1lf %.1lf\n",ans[].minn,ans[].ave);
}
} return ;
}
(这题没有负权环,数据量真的水,所以无论用那种最短路算法都可以——我用的spfa算法)
【最短路+较复杂处理】PAT-L3-005. 垃圾箱分布的更多相关文章
- PAT L3-005. 垃圾箱分布
最短路. 枚举垃圾箱放哪里,然后算最短路. #include<map> #include<set> #include<ctime> #include<cmat ...
- PAT 垃圾箱分布(30分)dijstra
垃圾箱分布 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾 ...
- PAT天梯赛L3-005 垃圾箱分布
题目链接:点击打开链接 大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾箱住.所以垃圾箱的位置必须选在到所有居民点的最短距离最长的地方,同时还要保证每个居民点都在距离它一个不太远的 ...
- PAT天梯赛练习题——L3-005. 垃圾箱分布(暴力SPFA)
L3-005. 垃圾箱分布 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁 ...
- PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)
L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...
- PTA刷题笔记
PTA刷题记录 仓库地址: https://github.com/Haorical/Code/tree/master/PTA/GPLT 两周之内刷完GPLT L2和L3的题,持续更新,包括AK代码,坑 ...
- L3-005. 垃圾箱分布
L3-005. 垃圾箱分布 题目链接:https://www.patest.cn/contests/gplt/L3-005 Dijstra 与L2-001.紧急救援类似,是Dijstra最短路的拓展, ...
- PAT甲级专题|最短路
PAT甲级最短路 主要算法:dijkstra 求最短最长路.dfs图论搜索. 1018,dijkstra记录路径 + dfs搜索路径最值 25分,错误点暂时找不出.. 如果只用dijkstra没法做, ...
- 【PAT L2-001】最短路计数
给定一个无向带权网络,无负边,无重边和自环,每个顶点有一个正数权值.首先求特定原点s到终点d的最短路的个数:然后求所有最短路中顶点权值a[i]之和最大的那条,输出这条路径. 可用dijkstra算法求 ...
随机推荐
- DES 指定键的大小对于此算法无效
KEY (byte[]) 长度不为8. 一般KEY使用UTF8编码. byte[] byKey = Encoding.UTF8.GetBytes(key); 加密内容的编码,由两方协商. Sys ...
- 爬虫存储介质之CSV文件存储
本文章来自度娘 CSV文件存储 CSV,全称为Comma-Separated Values,中文可以叫做逗号分隔值或字符分隔值,其文件以纯文本形式 存储表格数据.该文件是一个字符序列,可以由任意数目的 ...
- php 微服务
https://neatlifecoco.com/15618891575018.html https://juejin.im/post/5d3927816fb9a07ee27b58df https:/ ...
- BGP 实验
一.环境准备 1. 软件:GNS3 2. 路由:c7200 二.实验操作 实验要求: 1. 掌握 BGP 的基本配置方法. 2. 掌握如何查看 BGP 的各种配置信息. 3. 掌握基于回环口的 BGP ...
- samtools获取uniq reads
参考地址: https://www.biostars.org/p/56246/ -q INT only include reads with mapping quality >= INT [0] ...
- 软件素材---linux C语言:linux下获取可执行文件的绝对路径--getcwd函数
//头文件:#include <unistd.h> //定义函数:char * getcwd(char * buf, size_t size); //函数说明:getcwd()会将当前的工 ...
- as报错 Multiple root tags Unexpected tokens 这个都是编译器识别问题
从网上复制了个代码,直接复制上,结果一篇红线提示Unexpected tokens 通过去掉空格,还是无法根治,别的地方复制的就没有问题. 通过查看复制的网页源码 可以看到里边<> 这个符 ...
- 题解 CF1216D 【Swords】
大水题,感觉比C题水多了...(证明倒是挺难) 题目大意:额,这个(实在总结不出) 还是题目描述吧:仓库里有$n$种相同数量($x$把)的剑(但你不知道有多少),一天有$y$人闯进了仓库,每人拿了$z ...
- Python尾递归优化
Python开启尾递归优化 cpython本身不支持尾递归优化, 但是一个牛人想出的解决办法:实现一个 tail_call_optimized 装饰器 #!/usr/bin/env python2.4 ...
- PAT(B) 1072 开学寄语(Java)统计
题目链接:1072 开学寄语 (20 point(s)) 题目描述 下图是上海某校的新学期开学寄语:天将降大任于斯人也,必先删其微博,卸其 QQ,封其电脑,夺其手机,收其 ipad,断其 wifi,使 ...