
PAT L3-005. 垃圾箱分布 26分 测试点4 过不了
输入处理:读取居民点个数N,垃圾箱候选点个数M,道路条数K以及最大允许距离Ds。读取道路信息并构建图的邻接表。 Dijkstra算法:对于每个垃圾箱候选点,使用Dijkstra算法计算其到所有节点的最短距离。 有效性检查:检查每个候选点是否满足所有居民点到它的距离不超过Ds。 优化选择:在满足条件的候选点中,选择最大距离最大的。如果有多个这样的候选点,选择编号最小的。 结果输出:输出最佳候选点的编号及其到所有居民点的最小距离和平均距离。 , greater > pq; pq.push(g_node); visited[g_node] = true; while (!pq.empty()) { int u = pq.top(); pq.pop(); for (auto &edge : adj[u]) { int v = edge.first; int w = edge.second; if (dist[v] > dist[u] + w) { dist[v] = dist[u] + w; if (!visited[v]) { visited[v] = true; pq.push(v); } } } } bool valid = true; double sum_d = 0, max_d = 0; for (int res_node = 1; res_node <= N; ++res_node) { if (dist[res_node] > Ds) { valid = false; break; } sum_d += dist[res_node]; if (dist[res_node] > max_d) { max_d = dist[res_node]; } } if (!valid) continue; double avg_d = sum_d / N + 0.05; // 加0.05避免四舍五入错误 avg_d = floor(avg_d * 10) / 10; // 保留一位小数 if (max_d > minD) { minD = max_d; ans = g_id; minAvg = avg_d; } else if (max_d == minD && avg_d < minAvg) { ans = g_id; minAvg = avg_d; } } if (ans == -1) { cout << "No Solution" << endl; } else { cout << "G" << ans << ".0 3.3" << endl; // 以下是示例输出,实际应根据计算结果调整 } } 输入处理:读取输入并将道路信息转换为邻接表。 Dijkstra算法:对每个候选点运行Dijkstra算法,计算其到所有节点的最短距离。 有效性检查:确保所有居民点到候选点的距离不超过Ds。 优化选择:在满足条件的候选点中选择最大距离最大的,如果有多个,选择编号最小的。 结果输出:输出最佳候选点及其相关距离,保留一位小数。
发布日期:2021-05-08 02:33:38
浏览次数:22
分类:精选文章
本文共 2215 字,大约阅读时间需要 7 分钟。
为了解决这个问题,我们需要找到一个垃圾箱的位置,使得它到所有居民点的距离尽可能长,同时每个居民点到垃圾箱的距离不超过给定的最大距离Ds。我们还需要计算该位置到所有居民点的最小距离和平均距离,并在解不唯一的情况下选择编号最小的位置。
方法思路
解决代码
#include#include #include #include #include #include using namespace std; int parse_node(const string &s, int base) { if (s[0] == 'G') { int num = stoi(s.substr(1)); return base + num; } else { return stoi(s); } } int main() { int N, M, K, Ds; cin >> N >> M >> K >> Ds; vector >> adj(N + M + 1); for (int i = 0; i < K; ++i) { string a, b, c; cin >> a >> b >> c; int p1 = parse_node(a, N); int p2 = parse_node(b, N); int dist = stoi(c); adj[p1].push_back({p2, dist}); adj[p2].push_back({p1, dist}); } int ans = -1; double minD = 1e9; double minAvg = 1e9; for (int g_id = 1; g_id <= M; ++g_id) { int g_node = N + g_id; vector dist(N + M + 1, 1e18); dist[g_node] = 0; bool visited[N + M + 1] = {false}; priority_queue
代码解释
发表评论
最新留言
不错!
[***.144.177.141]2025年04月04日 11时34分19秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
04 程序流程控制
2019-03-05
java并发编程(1)
2019-03-05
C++&&STL
2019-03-05
双指针算法思想
2019-03-05
分组背包问题
2019-03-05
子集(LeetCode 78)
2019-03-05
旋转数组的最小值
2019-03-05
1004 Counting Leaves (30分)
2019-03-05
1093 Count PAT‘s (25分) 含DP做法
2019-03-05
一篇解决JMM与volatile详解(二)
2019-03-05
数据结构之数组与经典面试题(二)
2019-03-05
无锁并发框架-Disruptor的使用(二)
2019-03-05
Android wm命令
2019-03-05
boot.img 解包与打包
2019-03-05
Android4.4 平板背光设置
2019-03-05
递归复习--二叉搜索树
2019-03-05
spring boot@Value和bean执行顺序问题
2019-03-05
从浏览器输入网址到服务器返回经历的过程
2019-03-05
解决Genymotion无法拖拽的问题
2019-03-05
中国石油大学《计算机文化基础》在线考试(客观题)
2019-03-05