追债之旅(Dijkstra最短路)
追债之旅
思路
最短路问题,考虑DijkstraDijkstraDijkstra,用一个二维dis[i][j]dis[i][j]dis[i][j]数组,表示第iii天到达jjj号点的最小花费,disdisdis数组的更新方式改为if(dis[day][to]>dis[day−1][now]+value[to]+cost[day])if(dis[day][to] > dis[day - 1][now] + value[to] + cost[day])if(dis[day][to]>dis[day−1][now]+value[to]+cost[day])则更新disdisdis数组,所以我们最后只要遍历iii天到达nnn号节点,也就是dis[i][n]dis[i][n]dis[i][n]数组,最后取其最小值就行。
DijkstraDijkstraDijkstra的关键就是一个有能够记录day,value,posday, value, posday,value,pos当前天数,这个状态的最小值,当前位置,这样的结构体,然后重载一下小于号运算符就可以跑个DijkstraDijkstraDijkstra板子了。
代码
/*Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>#define mp make_pair
#define pb push_back
#define endl '\n'
#define mid (l + r >> 1)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define ls rt << 1
#define rs rt << 1 | 1using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;inline ll read() {ll x = 0, f = 1; char c = getchar();while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return x * f;
}const int N1 = 1e3 + 10, N2 = 2e4 + 10;int head[N1], to[N2], nex[N2], value[N2], cnt = 1;
int visit[20][N1], dis[20][N1], cost[20], n, m, k;struct Node {int day, pos, value;Node(int _day = 0, int _pos = 0, int _value = 0) : day(_day), pos(_pos), value(_value) {}bool operator < (const Node & t) const {return value > t.value;}
};void add(int x, int y, int w) {to[cnt] = y;nex[cnt] = head[x];value[cnt] = w;head[x] = cnt++;
}void Dijkstra() {for(int i = 0; i <= k; i++)for(int j = 0; j <= n; j++)dis[i][j] = inf;priority_queue<Node> q;q.push(Node(0, 1, 0));dis[0][1] = 0;while(!q.empty()) {Node temp = q.top();q.pop();if(visit[temp.day][temp.pos]) continue;visit[temp.day][temp.pos];int u = temp.pos, day = temp.day, w = temp.value;for(int i = head[u]; i; i = nex[i]) {if(day + 1 > k) continue;if(dis[day + 1][to[i]] > w + value[i] + cost[day + 1]) {dis[day + 1][to[i]] = w + value[i] + cost[day + 1];q.push(Node(day + 1, to[i], dis[day + 1][to[i]]));}}}
}int main () {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);n = read(), m = read(), k = read();for(int i = 1; i <= m; i++) {int x = read(), y = read(), w = read();add(x, y, w);add(y, x, w);}for(int i = 1; i <= k; i++)cost[i] = read();Dijkstra();int ans = inf;for(int i = 1; i <= k; i++)ans = min(ans, dis[i][n]);printf("%d\n", ans == inf ? -1 : ans);return 0;
}
追债之旅(Dijkstra最短路)相关推荐
- c语言cin n1 n2,牛客等级之题N1 追债之旅 - N2 Rinne Loves Study(8.6场)
牛客等级之题N1-A.追债之旅(8.6场) 题目描述 小明现在要追讨一笔债务,已知有n座城市,每个城市都有编号,城市与城市之间存在道路相连(每条道路都是双向的),经过任意一条道路需要支付费用.小明一开 ...
- 坐在马桶上看算法:Dijkstra最短路算法
[坐在马桶上看算法]算法7:Dijkstra最短路算法 上周我们介绍了神奇的只有五行的 ...
- 迪克斯特拉算法(Dijkstra 最短路算法)(简单易懂)
Dijkstra 最短路算法 上周我们介绍了神奇的只有五行的 Floyd 最短路算法,它可以方便的求得任意两点的最短路径,这称为"多源最短路".本周来来介绍指定一个点(源点)到其余 ...
- 1111 Online Map (30 分)【难度: 一般 / 知识点: Dijkstra最短路】
https://pintia.cn/problem-sets/994805342720868352/problems/994805358663417856 很传统的最短路,不过要跑两次,其实分开来的话 ...
- Dijkstra 最短路
#include <iostream> #define INF 9999999 using namespace std;int main() {int e[51][51],book[50] ...
- AtCoder Regular Contest 061 E - Snuke‘s Subway Trip(建图 + dijkstra最短路 / 0/1bfs / 并查集)
AtCoder Regular Contest 061 E - Snuke's Subway Trip problem 洛谷翻译 my idea 最近一直在做网络流,所以一读这题后,我就想到了最小费用 ...
- [NOI2018] 归程(线段树维护并查集的可持久化/kruskal重构树,倍增+dijkstra最短路)
[NOI2018] 归程 description solution1 code1 solution2 code description 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要 ...
- 「JOISC 2020 Day4」治疗计划(线段树+dijkstra最短路)
「JOISC 2020 Day4」治疗计划 description solution 设dpi:1−Ridp_i:1-R_idpi:1−Ri 都能被救治成功的最小花费 两个治疗方案[Li,Ri], ...
- Dijkstra 最短路算法(只能计算出一条最短路径,所有路径用dfs)
上周我们介绍了神奇的只有五行的 Floyd 最短路算法,它可以方便的求得任意两点的最短路径,这称为"多源最短路".本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做&q ...
最新文章
- 开发人员应该对IIS理论层的知识了解的多一些~第四讲 HttpModule中的几大事件
- 《PHP精粹:编写高效PHP代码》——2.1节数据持久化和Web应用程序
- 探究netty的观察者设计模式
- 第六章 hbase shell 命令
- java asin_Java asin()方法
- Windows平台WebRTC编译-VS2017
- 微信小程序|开发实战篇之八-list列表组件及其子组件
- c和go 两种语言结合使用 (一)
- Flutter最佳入门方式——写一个计算器
- 服务器电源的电源管理芯片,TI推出新款IC PMBus 管理及保护服务器电源
- Android 开发工具一键下载
- Lodop 打印使用笔记
- js vue echarts 前端绘制 cie1931 马蹄图 色度图
- 自抗扰控制理论(一)ADRC的原理
- QQ互联官网使用跳坑
- 合成孔径 saft matlab,合成孔径聚焦超声成像研究
- linux css压缩工具下载,推荐15个最好用的JavaScript代码压缩工具
- 支付宝网关支付模式详细解答
- JAVA毕业设计广东省梅州市宇恒节能科技有限公司计算机源码+lw文档+系统+调试部署+数据库
- 电容笔和触控笔哪个好?非常值得入手的平价电容笔推荐
热门文章
- 两个简单多边形面积相等,那么其中一个能分割成有限多块多边形,经过平移和旋转,拼合成第二个多边形...
- 两年发表14篇论文,其中10篇一作,这是她的科研进阶攻略
- 优雅的读懂支持向量机 SVM 算法
- 《SAS编程与数据挖掘商业案例》学习笔记之十八
- github怎么隐藏自己的pr记录_记便签的软件哪个好?怎么及时记录自己的想法
- oracle怎么删除lob对象,Oracle系列:LOB大对象处理
- 浅谈Redis五种数据结构的底层原理
- python自动化测试脚本怎么编写_编写自动化测试脚本心得---菜鸟入门篇
- flask mysql项目模板渲染_21. Flask 模板 - 宏、继承、包含
- java实用教程——组件及事件处理——对话框(dialog)