追债之旅

思路

最短路问题,考虑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最短路)相关推荐

  1. c语言cin n1 n2,牛客等级之题N1 追债之旅 - N2 Rinne Loves Study(8.6场)

    牛客等级之题N1-A.追债之旅(8.6场) 题目描述 小明现在要追讨一笔债务,已知有n座城市,每个城市都有编号,城市与城市之间存在道路相连(每条道路都是双向的),经过任意一条道路需要支付费用.小明一开 ...

  2. 坐在马桶上看算法:Dijkstra最短路算法

                                                             [坐在马桶上看算法]算法7:Dijkstra最短路算法 上周我们介绍了神奇的只有五行的 ...

  3. 迪克斯特拉算法(Dijkstra 最短路算法)(简单易懂)

    Dijkstra 最短路算法 上周我们介绍了神奇的只有五行的 Floyd 最短路算法,它可以方便的求得任意两点的最短路径,这称为"多源最短路".本周来来介绍指定一个点(源点)到其余 ...

  4. 1111 Online Map (30 分)【难度: 一般 / 知识点: Dijkstra最短路】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805358663417856 很传统的最短路,不过要跑两次,其实分开来的话 ...

  5. Dijkstra 最短路

    #include <iostream> #define INF 9999999 using namespace std;int main() {int e[51][51],book[50] ...

  6. AtCoder Regular Contest 061 E - Snuke‘s Subway Trip(建图 + dijkstra最短路 / 0/1bfs / 并查集)

    AtCoder Regular Contest 061 E - Snuke's Subway Trip problem 洛谷翻译 my idea 最近一直在做网络流,所以一读这题后,我就想到了最小费用 ...

  7. [NOI2018] 归程(线段树维护并查集的可持久化/kruskal重构树,倍增+dijkstra最短路)

    [NOI2018] 归程 description solution1 code1 solution2 code description 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要 ...

  8. 「JOISC 2020 Day4」治疗计划(线段树+dijkstra最短路)

    「JOISC 2020 Day4」治疗计划 description solution 设dpi:1−Ridp_i:1-R_idpi​:1−Ri​ 都能被救治成功的最小花费 两个治疗方案[Li,Ri], ...

  9. Dijkstra 最短路算法(只能计算出一条最短路径,所有路径用dfs)

    上周我们介绍了神奇的只有五行的 Floyd 最短路算法,它可以方便的求得任意两点的最短路径,这称为"多源最短路".本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做&q ...

最新文章

  1. 开发人员应该对IIS理论层的知识了解的多一些~第四讲 HttpModule中的几大事件
  2. 《PHP精粹:编写高效PHP代码》——2.1节数据持久化和Web应用程序
  3. 探究netty的观察者设计模式
  4. 第六章 hbase shell 命令
  5. java asin_Java asin()方法
  6. Windows平台WebRTC编译-VS2017
  7. 微信小程序|开发实战篇之八-list列表组件及其子组件
  8. c和go 两种语言结合使用 (一)
  9. Flutter最佳入门方式——写一个计算器
  10. 服务器电源的电源管理芯片,TI推出新款IC PMBus 管理及保护服务器电源
  11. Android 开发工具一键下载
  12. Lodop 打印使用笔记
  13. js vue echarts 前端绘制 cie1931 马蹄图 色度图
  14. 自抗扰控制理论(一)ADRC的原理
  15. QQ互联官网使用跳坑
  16. 合成孔径 saft matlab,合成孔径聚焦超声成像研究
  17. linux css压缩工具下载,推荐15个最好用的JavaScript代码压缩工具
  18. 支付宝网关支付模式详细解答
  19. JAVA毕业设计广东省梅州市宇恒节能科技有限公司计算机源码+lw文档+系统+调试部署+数据库
  20. 电容笔和触控笔哪个好?非常值得入手的平价电容笔推荐

热门文章

  1. 两个简单多边形面积相等,那么其中一个能分割成有限多块多边形,经过平移和旋转,拼合成第二个多边形...
  2. 两年发表14篇论文,其中10篇一作,这是她的科研进阶攻略
  3. 优雅的读懂支持向量机 SVM 算法
  4. 《SAS编程与数据挖掘商业案例》学习笔记之十八
  5. github怎么隐藏自己的pr记录_记便签的软件哪个好?怎么及时记录自己的想法
  6. oracle怎么删除lob对象,Oracle系列:LOB大对象处理
  7. 浅谈Redis五种数据结构的底层原理
  8. python自动化测试脚本怎么编写_编写自动化测试脚本心得---菜鸟入门篇
  9. flask mysql项目模板渲染_21. Flask 模板 - 宏、继承、包含
  10. java实用教程——组件及事件处理——对话框(dialog)