AOJ 2249 Road Construction (dijkstra)
某国王需要修路,王国有一个首都和多个城市,需要修路。已经有修路计划了,但是修路费用太高。
为了减少修路费用,国王决定从计划中去掉一些路,但是需要满足一下两点:
- 保证所有城市都能连通
- 所有城市到首都的最短路不变
思路:
在Dijkstra找最短路的时候,就记录一下费用
- if(d[e.to] > d[v] + e.dist)
- {
- ...
- prev_min_cost[e.to] = e.cost; // 最短路必经之路,则费用也必须要
- }
- else if(d[e.to] == d[v] + e.dist) // 最短路可选择之路,选择最小的费用连接
- prev_min_cost[e.to] = min(prev_min_cost[e.to], e.cost);
程序
- #include <iostream>
- #include <queue>
- #include <functional>
- #include <cstring>
- using namespace std;
- struct edge
- {
- int to, dist, cost;
- edge(int to, int dist, int cost) : to(to), dist(dist), cost(cost) {}
- bool operator<(const edge &b) const
- {
- return dist > b.dist;
- }
- };
- vector<edge> G[10005];
- int N, M; // 节点数,道路数
- int d[10005]; // 距离源点s(s==1)的最小距离
- int prev_min_cost[10005]; // 节点的邻接边最小花费
- int ans;
- void dijkstra(int s)
- {
- memset(d, 0x3f, sizeof(d));
- memset(prev_min_cost, 0x3f, sizeof(prev_min_cost));
- d[s] = 0;
- priority_queue<edge> que;
- que.push(edge(s, d[s], 0));
- while (!que.empty())
- {
- edge p = que.top(); que.pop();
- int v = p.to;
- if (d[v] < p.dist) continue;
- for (int i = 0; i<G[v].size(); ++i)
- {
- edge e = G[v][i];
- if (d[e.to] > d[v] + e.dist)
- {
- d[e.to] = d[v] + e.dist;
- que.push(edge(e.to, d[e.to], G[v][i].cost));
- prev_min_cost[e.to] = e.cost; // 最短路必经之路,则费用也必须要
- }
- else if (d[e.to] == d[v] + e.dist) // 最短路可选择之路,选择最小的费用连接
- prev_min_cost[e.to] = min(prev_min_cost[e.to], e.cost);
- }
- }
- }
- void solve()
- {
- dijkstra(1);
- for (int u = 2; u <= N; ++u) ans += prev_min_cost[u]; // 求出所有必须的费用(n-1条边)
- cout << ans << endl;
- }
- int main()
- {
- int u, v, d, c;
- while (cin >> N >> M)
- {
- for (int u = 1; u <= N; ++u) G[u].clear();
- ans = 0;
- if (N == M && N == 0) break;
- for (int i = 0; i < M; ++i)
- {
- cin >> u >> v >> d >> c;
- G[u].push_back(edge(v, d, c)); // 构图
- G[v].push_back(edge(u, d, c));
- }
- solve();
- }
- return 0;
- }
AOJ 2249 Road Construction (dijkstra)的更多相关文章
- AOJ 2249 Road Construction(Dijkstra+优先队列)
[题目大意] http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2249 [题目大意] 一张无向图,建造每条道路需要的费用已经给出, 现 ...
- Aizu-2249 Road Construction(dijkstra求最短路)
Aizu - 2249 题意:国王本来有一个铺路计划,后来发现太贵了,决定删除计划中的某些边,但是有2个原则,1:所有的城市必须能达到. 2:城市与首都(1号城市)之间的最小距离不能变大. 并且在这2 ...
- Aizu2249 Road Construction(dijkstra优化+思路 好题)
https://vjudge.net/problem/Aizu-2249 感觉这题和2017女生赛的Deleting Edge思路很像,都是先找最短路,然后替换边的. 但是这题用最朴素的dijkstr ...
- 迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)
迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合 ...
- 最短路径之迪杰斯特拉(Dijkstra)算法
迪杰斯特拉(Dijkstra)算法主要是针对没有负值的有向图,求解其中的单一起点到其他顶点的最短路径算法.本文主要总结迪杰斯特拉(Dijkstra)算法的原理和算法流程,最后通过程序实现在一个带权值的 ...
- 理解最短路径——迪杰斯特拉(dijkstra)算法
原址地址:http://ibupu.link/?id=29 1. 迪杰斯特拉算法简介 迪杰斯特拉(dijkstra)算法是典型的用来解决最短路径的算法,也是很多教程中的范例,由荷兰计算机科 ...
- 图论——迪杰斯特拉算法(Dijkstra)实现,leetcode
迪杰斯特拉算法(Dijkstra):求一点到另外一点的最短距离 两种实现方法: 邻接矩阵,时间复杂度O(n^2) 邻接表+优先队列,时间复杂度O(mlogn)(适用于稀疏图) (n:图的节点数,m:图 ...
- 算法-迪杰斯特拉算法(dijkstra)-最短路径
迪杰斯特拉算法(dijkstra)-最短路径 简介: 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中 ...
- 数据结构与算法——迪杰斯特拉(Dijkstra)算法
tip:这个算法真的很难讲解,有些地方只能意会了,多思考多看几遍还是可以弄懂的. 应用场景-最短路径问题 战争时期,胜利乡有 7 个村庄 (A, B, C, D, E, F, G) ,现在有六个邮差, ...
随机推荐
- C# 实现Bezier曲线(vs2008)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 23. Spring Boot JPA BaseDao 配置 文章
参考文献:(早期JPA版本的描述) https://blog.csdn.net/yingxiake/article/details/51017797 https://www.jianshu.com/p ...
- 交叉熵的数学原理及应用——pytorch中的CrossEntropyLoss()函数
分类问题中,交叉熵函数是比较常用也是比较基础的损失函数,原来就是了解,但一直搞不懂他是怎么来的?为什么交叉熵能够表征真实样本标签和预测概率之间的差值?趁着这次学习把这些概念系统学习了一下. 首先说起交 ...
- G - Preparing for Exams
题目链接: https://vjudge.net/contest/251958#problem/G 具体思路: 圆内四边形内角互补,所以,如图所示. 证明,三角形oda和三角形obc相似. 第一步,角 ...
- 2017-2018-2 20155303『网络对抗技术』Exp4:恶意代码分析
2017-2018-2 20155303『网络对抗技术』Exp4:恶意代码分析 --------CONTENTS-------- 一.原理与实践说明 1.实践目标 2.实践内容概述 3.基础问题回答 ...
- SVG2PNG(前台和后台将SVG转换为PNG)--amcharts导出png
在项目中用到了amcharts,amcharts图标统计插件是利用SVG实现的,其自带下载png功能,但是不支持IE以下浏览器.因此研究了SVG转换为png,最终实现的效果是将amcharts生成一张 ...
- MR架构
MapReduce框架结构 Map/Reduce是一个用于大规模数据处理的分布式计算模型,它最初是由Google工程师设计并实现的,Google已经将它完整的MapReduce论文公开发布了.其中对它 ...
- SRS服务器搭建,ffmpeg 本地推流,srs从本地拉流
参考: https://github.com/ossrs/srs/wiki/v2_CN_SampleFFMPEG git clone https://github.com/ossrs/srs cd s ...
- dump_stack的简单使用 【转】
转自:http://blog.chinaunix.net/uid-26403844-id-3361770.html http://blog.csdn.net/ryfjx6/article/detail ...
- windows命令行中英文切换
Windows下cmd命令提示符窗口的语言设置(中英) 打开cmd命令提示窗口 输入 chcp 936 使用ping 命令 显示中文 2 同样 输入chcp 437 3 使用ping 命令