某国王需要修路,王国有一个首都和多个城市,需要修路。已经有修路计划了,但是修路费用太高。

为了减少修路费用,国王决定从计划中去掉一些路,但是需要满足一下两点:

  1. 保证所有城市都能连通
  2. 所有城市到首都的最短路不变

思路:

在Dijkstra找最短路的时候,就记录一下费用

  1. if(d[e.to] > d[v] + e.dist)
  2. {
  3. ...
  4. prev_min_cost[e.to] = e.cost; // 最短路必经之路,则费用也必须要
  5. }
  6. else if(d[e.to] == d[v] + e.dist) // 最短路可选择之路,选择最小的费用连接
  7. prev_min_cost[e.to] = min(prev_min_cost[e.to], e.cost);

程序

  1. #include <iostream>
  2. #include <queue>
  3. #include <functional>
  4. #include <cstring>
  5. using namespace std;
  6. struct edge
  7. {
  8. int to, dist, cost;
  9. edge(int to, int dist, int cost) : to(to), dist(dist), cost(cost) {}
  10. bool operator<(const edge &b) const
  11. {
  12. return dist > b.dist;
  13. }
  14. };
  15. vector<edge> G[10005];
  16. int N, M; // 节点数,道路数
  17. int d[10005]; // 距离源点s(s==1)的最小距离
  18. int prev_min_cost[10005]; // 节点的邻接边最小花费
  19. int ans;
  20. void dijkstra(int s)
  21. {
  22. memset(d, 0x3f, sizeof(d));
  23. memset(prev_min_cost, 0x3f, sizeof(prev_min_cost));
  24. d[s] = 0;
  25. priority_queue<edge> que;
  26. que.push(edge(s, d[s], 0));
  27. while (!que.empty())
  28. {
  29. edge p = que.top(); que.pop();
  30. int v = p.to;
  31. if (d[v] < p.dist) continue;
  32. for (int i = 0; i<G[v].size(); ++i)
  33. {
  34. edge e = G[v][i];
  35. if (d[e.to] > d[v] + e.dist)
  36. {
  37. d[e.to] = d[v] + e.dist;
  38. que.push(edge(e.to, d[e.to], G[v][i].cost));
  39. prev_min_cost[e.to] = e.cost; // 最短路必经之路,则费用也必须要
  40. }
  41. else if (d[e.to] == d[v] + e.dist) // 最短路可选择之路,选择最小的费用连接
  42. prev_min_cost[e.to] = min(prev_min_cost[e.to], e.cost);
  43. }
  44. }
  45. }
  46.  
  47. void solve()
  48. {
  49. dijkstra(1);
  50. for (int u = 2; u <= N; ++u) ans += prev_min_cost[u]; // 求出所有必须的费用(n-1条边)
  51. cout << ans << endl;
  52. }
  53.  
  54. int main()
  55. {
  56. int u, v, d, c;
  57. while (cin >> N >> M)
  58. {
  59. for (int u = 1; u <= N; ++u) G[u].clear();
  60. ans = 0;
  61. if (N == M && N == 0) break;
  62. for (int i = 0; i < M; ++i)
  63. {
  64. cin >> u >> v >> d >> c;
  65. G[u].push_back(edge(v, d, c)); // 构图
  66. G[v].push_back(edge(u, d, c));
  67. }
  68. solve();
  69. }
  70. return 0;
  71. }

AOJ 2249 Road Construction (dijkstra)的更多相关文章

  1. AOJ 2249 Road Construction(Dijkstra+优先队列)

    [题目大意] http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2249 [题目大意] 一张无向图,建造每条道路需要的费用已经给出, 现 ...

  2. Aizu-2249 Road Construction(dijkstra求最短路)

    Aizu - 2249 题意:国王本来有一个铺路计划,后来发现太贵了,决定删除计划中的某些边,但是有2个原则,1:所有的城市必须能达到. 2:城市与首都(1号城市)之间的最小距离不能变大. 并且在这2 ...

  3. Aizu2249 Road Construction(dijkstra优化+思路 好题)

    https://vjudge.net/problem/Aizu-2249 感觉这题和2017女生赛的Deleting Edge思路很像,都是先找最短路,然后替换边的. 但是这题用最朴素的dijkstr ...

  4. 迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)

    迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合 ...

  5. 最短路径之迪杰斯特拉(Dijkstra)算法

    迪杰斯特拉(Dijkstra)算法主要是针对没有负值的有向图,求解其中的单一起点到其他顶点的最短路径算法.本文主要总结迪杰斯特拉(Dijkstra)算法的原理和算法流程,最后通过程序实现在一个带权值的 ...

  6. 理解最短路径——迪杰斯特拉(dijkstra)算法

    原址地址:http://ibupu.link/?id=29 1.       迪杰斯特拉算法简介 迪杰斯特拉(dijkstra)算法是典型的用来解决最短路径的算法,也是很多教程中的范例,由荷兰计算机科 ...

  7. 图论——迪杰斯特拉算法(Dijkstra)实现,leetcode

    迪杰斯特拉算法(Dijkstra):求一点到另外一点的最短距离 两种实现方法: 邻接矩阵,时间复杂度O(n^2) 邻接表+优先队列,时间复杂度O(mlogn)(适用于稀疏图) (n:图的节点数,m:图 ...

  8. 算法-迪杰斯特拉算法(dijkstra)-最短路径

    迪杰斯特拉算法(dijkstra)-最短路径 简介: 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中 ...

  9. 数据结构与算法——迪杰斯特拉(Dijkstra)算法

    tip:这个算法真的很难讲解,有些地方只能意会了,多思考多看几遍还是可以弄懂的. 应用场景-最短路径问题 战争时期,胜利乡有 7 个村庄 (A, B, C, D, E, F, G) ,现在有六个邮差, ...

随机推荐

  1. C# 实现Bezier曲线(vs2008)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. 23. Spring Boot JPA BaseDao 配置 文章

    参考文献:(早期JPA版本的描述) https://blog.csdn.net/yingxiake/article/details/51017797 https://www.jianshu.com/p ...

  3. 交叉熵的数学原理及应用——pytorch中的CrossEntropyLoss()函数

    分类问题中,交叉熵函数是比较常用也是比较基础的损失函数,原来就是了解,但一直搞不懂他是怎么来的?为什么交叉熵能够表征真实样本标签和预测概率之间的差值?趁着这次学习把这些概念系统学习了一下. 首先说起交 ...

  4. G - Preparing for Exams

    题目链接: https://vjudge.net/contest/251958#problem/G 具体思路: 圆内四边形内角互补,所以,如图所示. 证明,三角形oda和三角形obc相似. 第一步,角 ...

  5. 2017-2018-2 20155303『网络对抗技术』Exp4:恶意代码分析

    2017-2018-2 20155303『网络对抗技术』Exp4:恶意代码分析 --------CONTENTS-------- 一.原理与实践说明 1.实践目标 2.实践内容概述 3.基础问题回答 ...

  6. SVG2PNG(前台和后台将SVG转换为PNG)--amcharts导出png

    在项目中用到了amcharts,amcharts图标统计插件是利用SVG实现的,其自带下载png功能,但是不支持IE以下浏览器.因此研究了SVG转换为png,最终实现的效果是将amcharts生成一张 ...

  7. MR架构

    MapReduce框架结构 Map/Reduce是一个用于大规模数据处理的分布式计算模型,它最初是由Google工程师设计并实现的,Google已经将它完整的MapReduce论文公开发布了.其中对它 ...

  8. SRS服务器搭建,ffmpeg 本地推流,srs从本地拉流

    参考: https://github.com/ossrs/srs/wiki/v2_CN_SampleFFMPEG git clone https://github.com/ossrs/srs cd s ...

  9. dump_stack的简单使用 【转】

    转自:http://blog.chinaunix.net/uid-26403844-id-3361770.html http://blog.csdn.net/ryfjx6/article/detail ...

  10. windows命令行中英文切换

    Windows下cmd命令提示符窗口的语言设置(中英) 打开cmd命令提示窗口 输入 chcp 936 使用ping 命令 显示中文 2 同样 输入chcp 437 3 使用ping 命令