热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【最短路+较复杂处理】PATL3005.垃圾箱分布

L3-005.垃圾箱分布大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾箱住。所以垃圾箱的位置必须选在到所有居民点的最短距离最长的地
L3-005. 垃圾箱分布

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

现给定一个居民区的地图,以及若干垃圾箱的候选地点,请你推荐最合适的地点。如果解不唯一,则输出到所有居民点的平均距离最短的那个解【此处为第二重排序的原则】。如果这样的解还是不唯一,则输出编号最小的地点【此处为第三重排序的原则,尽管遍历的时候是按顺序的,但sort排序的时候不是有序进行比较的(具体自己百度sort百度原理),所以比较加上这条!】。

输入格式:

输入第一行给出4个正整数&#xff1a;N&#xff08;<&#61; 103&#xff09;是居民点的个数【在这里也WA了一次&#xff0c;因为编号是123的时候就需要来一个while循环进行字符串转数字了】&#xff1b;M&#xff08;<&#61; 10&#xff09;是垃圾箱候选地点的个数&#xff1b;K&#xff08;<&#61; 104&#xff09;是居民点和垃圾箱候选地点之间的道路的条数&#xff1b;DS是居民点与垃圾箱之间不能超过的最大距离【这里不用double来存贮其实也是可以过的&#xff0c;WA了第六遍的时候我以为是数据超int了需要用double来存&#xff0c;貌似是无用的】。所有的居民点从1到N编号&#xff0c;所有的垃圾箱候选地点从G1到GM编号。

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

输出格式&#xff1a;

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


 

AC代码&#xff1a;题目一般吧&#xff0c;细节仔细都能考虑到的。

1 #include
2 #include
3 #include<string.h>
4 #include
5 #include
6 #include
7 #include<set>
8 #include
9 #include<string>
10 #include
11 #define inf 0x3f3f3f3f
12 #define dinf 0x7fffffff*1.0
13 using namespace std; //L3-005,垃圾箱&#xff0c;16:50--
14 #define N 1200
15 #define ll long long
16 struct node{
17 int x;
18 double d;
19 node(int x&#61;0,double d&#61;0.0):x(x),d(d){}
20 };
21 struct node1{
22 int id;
23 double minn,ave;
24 node1(int id&#61;0,double minn&#61;-1,double ave&#61;-1):id(id),minn(minn),ave(ave){}
25 }ans[12];
26 //1--到所有居民点的最短距离 相比较最长的地方,2-相等时&#xff0c;按平均距离最短的那个解
27 bool cmp(node1 a,node1 b){
28 if(fabs(a.minn-b.minn)<1e-10){
29 if(fabs(a.ave-b.ave)<1e-10)
30 return a.id<b.id;
31 else
32 return a.ave<b.ave;
33 }
34 else
35 return a.minn>b.minn;
36 }
37 vectorG[N];//垃圾箱就是把垃圾箱自身编号加上N
38 double dis[N];
39 int vis[N];
40 int n,m,k;
41 double ds;//一个阈值
42 int cnt;
43 void debug(int num){
44 printf("gar:%d--",num);double s&#61;0;
45 for(int i&#61;1;i<&#61;n&#43;m;i&#43;&#43;){
46 s&#43;&#61;dis[i];
47 printf(" %.0lf",dis[i]);
48 }
49 cout<<" s: "<endl;
50 }
51
52 void spfa(int ed){
53 queue<int>Q;
54 for(int i&#61;1;i)
55 dis[i]&#61;dinf;
56 memset(vis,0,sizeof(vis));
57 Q.push(ed);
58 int u,v;
59 dis[ed]&#61;0.0;
60
61 while(Q.size()>0){
62 u&#61;Q.front();Q.pop();
63 vis[u]&#61;0;
64 for(int i&#61;0;i<(int)G[u].size();i&#43;&#43;){
65 v&#61;G[u][i].x;
66 if(dis[v]>dis[u]&#43;G[u][i].d){
67 dis[v]&#61;dis[u]&#43;G[u][i].d;
68 if(!vis[v]){
69 Q.push(v);
70 vis[v]&#61;1;
71 }
72 }
73 }
74 }
75 double minn&#61;dinf;
76 double sum&#61;0.0;
77 for(int i&#61;1;i<&#61;n;i&#43;&#43;){
78 if(dis[i]>ds)return ;
79 sum&#43;&#61;dis[i];
80 minn&#61;min(minn,dis[i]);
81 }
82 ans[&#43;&#43;cnt]&#61;node1(ed,minn,sum/(1.0*n) );
83 }
84 int fact(char ch[]){
85 int x&#61;0,i&#61;0;
86 if(ch[0]&#61;&#61;&#39;G&#39;){
87 i&#61;1;
88 }
89 while(ch[i]!&#61;&#39;\0&#39;){
90 x &#61;x*10&#43;ch[i]-&#39;0&#39; ;
91 i&#43;&#43;;
92 }
93 if(ch[0]&#61;&#61;&#39;G&#39;)x&#43;&#61;n;
94 return x;
95 }
96 int main(){
97 char ch1[3],ch2[3];
98 while(scanf("%d%d%d%lf",&n,&m,&k,&ds)!&#61;EOF){
99 for(int i&#61;0;i)
100 G[i].clear();
101 cnt&#61;0;//统计加入ans结构体的个数
102 int x,y;
103 double dist;
104 for(int i&#61;1;i<&#61;k;i&#43;&#43;){
105 scanf("%s%s%lf",ch1,ch2,&dist);
106 x&#61;fact(ch1);
107 y&#61;fact(ch2);
108 G[x].push_back(node(y,dist));
109 G[y].push_back(node(x,dist));
110 }
111
112 for(int i&#61;1&#43;n;i<&#61;n&#43;m;i&#43;&#43;)
113 spfa(i);
114 if(cnt&#61;&#61;0){
115 printf("No Solution\n");
116 }
117 else{
118 sort(ans&#43;1,ans&#43;1&#43;cnt,cmp);
119 printf("G%d\n",ans[1].id-n);
120 printf("%.1lf %.1lf\n",ans[1].minn,ans[1].ave);
121 }
122 }
123
124 return 0;
125 }

View Code&#xff08;这题没有负权环&#xff0c;数据量真的水&#xff0c;所以无论用那种最短路算法都可以——我用的spfa算法&#xff09;

 


转:https://www.cnblogs.com/zhazhaacmer/p/8617584.html



推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
author-avatar
YOYO很快乐的傻瓜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有