https://nanti.jisuanke.com/t/31001

有K次机会可以让一条边的权值变为0,求最短路。

在存储单源最短路的数组上多开一维状态,d[i][k]表示走到序号i的点,且让k条边权值为0时的最短路。
对于每个待更新的点,尝试不置零此边的状态和置零此边的状态,分别压入优先队列去更新其他状态。

另外,此题由于有重边,需要先去重,保留同起始点最短的边。

代码:

#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <vector>
#include <cstdio>
using namespace std;
typedef long long ll;
const ll INF = 0x3f3f3f3f3f3f3f3fLL;
const int MAX_V = 100005;
const int MAX_E = 200005;
int N, M, K;
struct Dijkstra {struct Edge {int to, cost, next;} es[MAX_E];struct Node {int u, k;ll d;Node(int u, ll d, int k) : u(u), d(d), k(k) {}bool operator< (const Node& n) const {return d > n.d;}};int head[MAX_V];int V, E;ll d[MAX_V][15];bool vis[MAX_V][15];void init(int V) {this->V = V;this->E = 0;memset(head, -1, sizeof head);}void addEdge(int u, int v, int w) {es[E].to = v;es[E].cost = w;es[E].next = head[u];head[u] = E++;}void dijkstra(int s) {priority_queue <Node> Q;memset(d, 0x3f, sizeof d);memset(vis, 0, sizeof(vis));d[s][0] = 0;Q.push(Node(s, 0, 0));while (!Q.empty()) {int u = Q.top().u, k = Q.top().k;Q.pop();if (vis[u][k])continue;vis[u][k] = true;for (int i = head[u]; i != -1; i = es[i].next) {int v = es[i].to, w = es[i].cost;if (d[v][k] > d[u][k] + w) {d[v][k] = d[u][k] + w;Q.push(Node(v, d[v][k], k));}if (k + 1 <= K) {if (d[v][k + 1] > d[u][k]) {d[v][k + 1] = d[u][k];Q.push(Node(v, d[v][k + 1], k + 1));}}}}}
} dijk;
struct Elem {int u, v, w;bool operator< (const Elem& e) const {if (u == e.u && v == e.v) {return w < e.w;}if (u == e.u) {return v < e.v;}return u < e.u;}
} e[MAX_E];
int main() {int T;scanf("%d", &T);while (T--) {scanf("%d%d%d", &N, &M, &K);dijk.init(N);for (int i = 0; i < M; i++) {scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w);}sort(e, e + M);int preu = 0, prev = 0;for (int i = 0; i < M; i++) {if (preu != e[i].u || prev != e[i].v) {dijk.addEdge(e[i].u, e[i].v, e[i].w);preu = e[i].u, prev = e[i].v;}}dijk.dijkstra(1);ll ans = INF;for (int i = 0; i <= K; i++) {ans = min(ans, dijk.d[N][i]);}printf("%lld\n", ans);}
}

转载于:https://www.cnblogs.com/stolf/p/9572053.html

【分层最短路】Magical Girl Haze相关推荐

  1. 2018 ACM-ICPC南京网络赛 Magical Girl Haze(分层最短路)

    2018 ACM-ICPC南京网络赛 Magical Girl Haze There are NN cities in the country, and MM directional roads fr ...

  2. ACM-ICPC 2018 南京赛区网络预赛 L. Magical Girl Haze 最短路+分层图

    类似题解 There are NN cities in the country, and MM directional roads from uu to v(1\le u, v\le n)v(1≤u, ...

  3. 2018南京网络赛L题 Magical Girl Haze(分层图+优先队列优化的dijkstra)

    使用优先队列优化过的dijkstra时间复杂度可以达到O(v*logn),还是很快的. #include <iostream>                //最好是用long long ...

  4. Magical Girl Haze

    There are NNN cities in the country, and MMM directional roads from uuu to v(1≤u,v≤n)v(1\le u, v\le ...

  5. D - Age of Moyu HDU - 6386 -BFS+DFS分层最短路

    D - Age of Moyu HDU - 6386 题意:双向图,m条边,每条边有一个编号id,而花费就是根据这个id的变化来确定的求1-n的最短路 思路:全值为0,1的图直接bfs按层遍历图找到n ...

  6. [USACO09FEB]改造路Revamping Trails 分层最短路 Dijkstra BZOJ 1579

    题意翻译 约翰一共有N)个牧场.由M条布满尘埃的小径连接.小径可 以双向通行.每天早上约翰从牧场1出发到牧场N去给奶牛检查身体. 通过每条小径都需要消耗一定的时间.约翰打算升级其中K条小径,使之成为高 ...

  7. Codeforces Round #703 (Div. 2) E. Paired Payment 最短路 + 思维

    link 题意: 给一张图,每次只能一下走两个点,比如当前在aaa,往下走到bbb再到ccc,权值为(wa,b+wb,c)2(w_{a,b}+w_{b,c})^2(wa,b​+wb,c​)2.求1到其 ...

  8. ACM-ICPC 2018 南京赛区网络预赛

    轻轻松松也能拿到区域赛名额,CCPC真的好难 An Olympian Math Problem 问答 只看题面 54.76% 1000ms 65536K Alice, a student of gra ...

  9. JLOI2011 飞行路线

    洛谷 BZOJ 分析 经典的分层最短路题(我不会). 建 \(k+1\) 层图,跑一遍最短路,找到 \(dis[i]\) 最小的一个. 代码 #include <queue> #inclu ...

最新文章

  1. 70.打印所有Spring boot载入的bean【从零开始学Spring Boot】
  2. IEEE“撑不住”了?声明解除对华为评审限制
  3. python金融工程的工具包_金融工程及其Python应用
  4. Delphi中TWebBrowser中注入Js
  5. 50个linux指令,每天学一个 Linux 命令(50):date
  6. 南京工程学院计算机组成原理第二版答案,南大__计算机组成原理第二次作业
  7. vs2010 mysql linq to sql 系列_LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据...
  8. Dynamic Graph CNN for Learning on Point Clouds(DGCNN)论文阅读笔记——核心思想:EdgeConv细析
  9. 假如你有20万用来创业,你最想进入什么行业?
  10. java检测textarea换行_Textarea和Java 换行符
  11. 破解锐捷--实现路由器认证锐捷,轻松开WiFi
  12. 计算机毕业设计ssm电影院售票系统java项目mysql数据库
  13. DSP2812和28335的区别
  14. XJOI一级题库所有题解(传送门)
  15. python合并工作簿所有内容_如何快速的合并多个 Excel 工作簿成为一个工作簿?...
  16. mysql轮播图表设计_制作一个简单的轮播图
  17. 团队项目事后诸葛亮会议
  18. 任正非解释华为鸿蒙系统,比Android/iOS还要快,看任正非怎么说华为鸿蒙系统
  19. 性能测试指标及测试方法
  20. freeswitch呼入落地测试信息

热门文章

  1. java static 修饰_「static」JAVA static是什么?修饰符总结整理 - seo实验室
  2. SEO互点工具到底会对网站造成怎样的危害
  3. php如何修改服务器的端口号,php请求远程服务器端口号
  4. 单目摄像头内参的含义的使用
  5. linux进程 exe可执行文件空,linux可执行文件的内容分析工具nm objdump readelf ar ldd
  6. html5播放音频流,html5 – 使用Audio API播放音频流
  7. android 容器圆角,flutter Container容器实现圆角边框
  8. Cocos Creator | 飞刀大乱斗开发教程系列(二)!
  9. git实战-2、gitk使用
  10. 测试开发工作者日记:2020.10.12