L3-005. 垃圾箱分布
来源:互联网 发布:手机移动数据怎么关闭 编辑:程序博客网 时间:2024/05/14 02:18
大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾箱住。所以垃圾箱的位置必须选在到所有居民点的最短距离最长的地方,同时还要保证每个居民点都在距离它一个不太远的范围内。
现给定一个居民区的地图,以及若干垃圾箱的候选地点,请你推荐最合适的地点。如果解不唯一,则输出到所有居民点的平均距离最短的那个解。如果这样的解还是不唯一,则输出编号最小的地点。
输入格式:
输入第一行给出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 51 2 21 4 21 G1 41 G2 32 3 22 G2 13 4 23 G3 24 G1 3G2 G1 1G3 G2 2输出样例1:
G12.0 3.3输入样例2:
2 1 2 101 G1 92 G1 20输出样例2:
No Solution
思路分析:这道题和甲级1072题目是一样的。题目本身不难,就是题意不好懂。(尤其看1072英文题目的时候......)。思路就是Dijkstra + 第二标尺判断。
#include <iostream>#include <algorithm>#define MAX 1000 + 11#define INF 0x3fffffffusing namespace std;// 输入int N, M, K, D;int MGraph[MAX][MAX];// Dijkstraint dist[MAX];int visit[MAX];// 第二标尺int minDist = -1;int minIndex = -1;int minSum = INF;void initMGraph() { for( int i = 0; i < MAX; i++ ) { for( int j = 0; j < MAX; j++ ) { if( i == j ) MGraph[i][j] = 0; else MGraph[i][j] = INF; } }}int stringToInt( string str ) { int index = 0; int size = str.size(); if( str[0] == 'G' ) { for( int i = 1; i < size; i++ ) { index = index * 10 + ( str[i] - '0' ); } index += N; } else { for( int i = 0; i < size; i++ ) { index = index * 10 + ( str[i] - '0' ); } } return index;}void Dijkstra( int s ) { fill( dist, dist + MAX, INF ); fill( visit, visit + MAX, 0 ); dist[s] = 0; for( int i = 1; i <= N + M; i++ ) { int u = -1, MIN = INF; for( int j = 1; j <= N + M; j++ ) { if( !visit[j] && dist[j] < MIN ) { MIN = dist[j]; u = j; } } if( u == -1 ) return; visit[u] = 1; for( int v = 1; v <= N + M; v++ ) { if( !visit[v] && MGraph[u][v] != 0 && MGraph[u][v] != INF ) { if( dist[v] > dist[u] + MGraph[u][v] ) { dist[v] = dist[u] + MGraph[u][v]; } } } }}int main() { //freopen( "123.txt", "r", stdin ); initMGraph(); scanf( "%d%d%d%d", &N, &M, &K, &D ); string a, b; int l; for( int i = 0; i < K; i++ ) { cin >> a >> b >> l; int aId = stringToInt( a ); int bId = stringToInt( b ); MGraph[aId][bId] = l; MGraph[bId][aId] = l; } for( int i = N + 1; i <= N + M; i++ ) { Dijkstra( i ); sort( dist + 1, dist + 1 + N ); int curMin = dist[1]; int curMax = dist[N]; int curSum = 0; if( curMax > D ) continue; for( int j = 1; j <= N; j++ ) { curSum += dist[j]; } if( curMin > minDist ) { minDist = curMin; minIndex = i; minSum = curSum; } else if( curMin == minDist && curSum < minSum ) { minIndex = i; minSum = curSum; } } if( minIndex == -1 ) { printf( "No Solution\n" ); } else { printf( "G%d\n", minIndex - N ); printf( "%.1lf %.1lf\n", (double)minDist, (double)minSum / N ); } return 0;}
0 0
- L3-005. 垃圾箱分布
- L3-005. 垃圾箱分布
- L3-005. 垃圾箱分布
- PAT-练习集-L3-005. 垃圾箱分布
- 天梯赛 L3-005. 垃圾箱分布(最短路)
- GPLT L3-005. 垃圾箱分布【最短路Dijkstra】
- PAT天梯赛练习题——L3-005. 垃圾箱分布(暴力SPFA)
- L3-005. 垃圾箱分布-PAT团体程序设计天梯赛GPLT(Dijkstra)
- 团体程序设计天梯赛-练习集-L3-005. 垃圾箱分布(最短路dijkstra)
- 团体程序设计天梯赛-练习集 L3-005. 垃圾箱分布 dijkstra 解题报告
- 团体程序设计天梯赛L3-005 垃圾箱分布
- 垃圾箱
- L3
- Braun概念垃圾箱设计
- suse 垃圾箱位置
- MyEclipse垃圾箱设置
- hadoop运维--开启垃圾箱
- Qt 拖拽 动态 垃圾箱
- 欢迎使用CSDN-markdown编辑器
- JSP(1)
- dpdk 在VMware 中的安装部署
- DFS——HDU1010(经典的奇偶剪枝)
- 转载:关于函数返回值的几种情况
- L3-005. 垃圾箱分布
- Linux下安装jdk(openSUSE为例)
- 5.CAS增加验证码
- hdu1010 dfs+剪枝
- window 命令行运行的java 和 javac 显示的版本不同
- Quartz入门例子简介 从入门到菜鸟(四)
- MySQL 手动设置自动递增伟某一值
- UGUI背包(二)鼠标移动会显示信息框,拖拽物品
- 细说final关键字和static关键字