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

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

  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. Host is not allowed to connect to this MySQL server解决方法

    在装有MySQL的机器上登录MySQL mysql -u root -p密码 执行use mysql; 执行update user set host = '%' where user = 'root' ...

  2. 设置通过Maven创建的工程的JDK版本—一劳永逸

    设置通过Maven创建的工程的JDK版本—一劳永逸 [1]打开settings.xml文件 [2]找到profiles标签 [3]加入一下配置   <profile> <id> ...

  3. Docker入门02——Dockerfile详解

    基本示例 FROM MAINTAINER LABEL RUN ADD COPY CMD ENTRYPOINT ENV EXPOSE VOLUME WORKDIR USER ARG 基本示例 # Thi ...

  4. OpenCV入门(2)- Java第一个程序

    1.下载和安装OpenVC环境 从官方连接 https://opencv.org/releases.html 下载Windows的安装包 下载下来的就是一个压缩包,安装解压后,对Java开发有效的目录 ...

  5. 数据库运维平台~inception回滚功能

    一 简介:inception的另一个激动人心的功能,很强大.二 功能简介: inception会针对已经执行sql语句进行1 记录 2 生成回滚语句三 备份:   1 启用远程备份机制(强烈建议一台单 ...

  6. Database学习 - mysql 数据库 表操作

    mysql 数据库 表操作 创建数据表 基本语法格式: 创建数据表: create table 表名( 字段名 datatype 约束, 字段名 datatype 约束, ...... ) 修改表名 ...

  7. SpringBoot缓存

    (1).使用@EnableCaching注解开启基于注解的缓存 package cn.coreqi; import org.springframework.boot.SpringApplication ...

  8. SpringBoot整合Druid(阿里巴巴)数据源

    (1).添加相关依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId ...

  9. 《像计算机科学家一样思考Python》-递归

    斐波那契数列 使用递归定义的最常见数学函数是 fibonacci (斐波那契数列),见其 定义 fibonacci(0) = 0 fibonacci(1) = 1 fibonacci(n) = fib ...

  10. Python模块学习 - fnmatch & glob

    介绍 fnmatch 和 glob 模块都是用来做字符串匹配文件名的标准库. fnmatch模块 大部分情况下使用字符串匹配查找特定的文件就能满足需求,如果需要更加灵活的字符串匹配,就没有办法了,这里 ...