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

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

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

思路:

在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)的更多相关文章

  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. B+树,B树,聚集索引,非聚集索引

    简介: B+树中只有叶子节点会带有指向记录的指针,而B树则所有节点都带有 B+树索引可以分为聚集索引和非聚集索引 mysql使用B+树,其中Myisam是非聚集索引,innoDB是聚集索引 聚簇索引索 ...

  2. Nginx 学习笔记(五)nginx-vod-module 模块

    nginx-vod-module 一.编译 ./configure \ --user=www \ --group=www \ --prefix=/usr/local/openresty \ --wit ...

  3. crosstab(unknown, unknown) does not exist

    在pgadminIII用到交叉表时,给报了函数不存在 解决方法: 执行sql CREATE EXTENSION tablefunc; 结果 Query returned successfully wi ...

  4. 解决idea中找不到程序包和找不到符号的问题

    问题如图: 解决方法: 将三处编码都设置成UTF-8,亲测有效 本人也是拜读大佬博客后解决的: http://www.cnblogs.com/wzhanke/p/4747966.html

  5. 二、存储管理器--SDRAM

    2.1 硬件结构 2.1.1 硬件框图 CPU 通过存储管理器来读取 SDRAM 网卡 等外部设备,CPU不管外部设备是怎么样的,只是读存储管理器中的地址 CPU从0x30000000地址读取数据. ...

  6. 【摘】SVN提交与版本冲突

    一般性解决办法 1.要提交的内容备份到项目之外[为还原版本做准备] 2.还原[回到之前版本] 3.更新[更新版本号和版本] 4.填充内容[即 将自己之前备份的内容填充项目对应处] 5.提交 6.OK ...

  7. Java SE之浅谈JDK SDK JRE

    JDK(Java Development Kit):   1.定义:编写Java程序的程序员使用的软件开发工具包,又被称为Java SDK (Java Software Development Kit ...

  8. B - SETI POJ - 2065 (高斯消元)

    题目链接:https://vjudge.net/contest/276374#problem/B 题目大意: 输入一个素数p和一个字符串s(只包含小写字母和‘*’),字符串中每个字符对应一个数字,'* ...

  9. Mybatis的分页插件PageHelper分页失效的原因

    引用博客:个人博客地址:https://alexaccele.github.io/ PageHelper是Mybatis的一个很好的分页插件,但要使用它的分页功能需要注意一下几点 1.导入相关包,例如 ...

  10. ubuntu下安装搜狗输入法以及出现不能输入中文的解决办法

    1. 官网下载安装包 http://pinyin.sogou.com/linux/?r=pinyin 下载你需要的版本,这里选择64位版. 2. 进入软件中心安装 3. 修改ibus为fcitx im ...