给定一张 NN 个点(编号 1,2…N),MM 条边的有向图,求从起点 S 到终点 T 的第 K 短路的长度,路径允许重复经过点或边。

注意: 每条最短路中至少要包含一条边。

输入格式

第一行包含两个整数 N 和 M。

接下来 MM 行,每行包含三个整数 A,B 和 L,表示点 A 与点 B 之间存在有向边,且边长为 L。

最后一行包含三个整数 S,T 和 K,分别表示起点 S,终点 T 和第 K 短路。

输出格式

输出占一行,包含一个整数,表示第 KK 短路的长度,如果第 K 短路不存在,则输出 −1。

数据范围

1≤S,T≤N≤1000
0≤M≤10^4
1≤K≤1000
1≤L≤100

输入样例:

2 2
1 2 5
2 1 4
1 2 2

输出样例:

14

把所有的边加进去,寻找第k小的最短路
估计函数:从这个点走到终点的最短距离
其实就时反着跑一遍dijksta
根据A*算法:终点在第一次弹出来的时候是最小值,而如果弹第二次就是第二小的,所以第k次就是第k小的


#include <bits/stdc++.h>#define x first
#define y second
using namespace std;typedef pair<int, int> PII;
typedef pair<int, PII> PIII;//存储,估计距离+真实距离, 真实距离+当前点const int N = 1010, M = 200010;int n, m, S, T, K;
int h[N], rh[N], e[M], w[M], ne[M], idx;
int dist[N], cnt[N];
bool st[N];void add(int h[], int a, int b, int c)  // 添加一条边a->b,边权为c
{e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}void dijkstra()
{priority_queue<PII, vector<PII>, greater<PII>> heap;heap.push({0, T});//反向搜索一遍,找出估计函数的距离memset(dist, 0x3f, sizeof dist);dist[T] = 0;while(heap.size()){auto t = heap.top();heap.pop();int ver = t.y;if(st[ver]) continue;//更新过直接溜st[ver] = true;for(int i = rh[ver]; i != -1; i = ne[i])//反向搜索{int j = e[i];//取出这个边if (dist[j] > dist[ver] + w[i]){dist[j] = dist[ver] + w[i];heap.push({dist[j], j});}}}}int astar()
{priority_queue<PIII, vector<PIII>, greater<PIII>> heap;heap.push({dist[S], {0, S}});//这里的真实距离是指到起点哦,所以这里的dist[S]是到终点的估计距离//注意要找T出队k次的结果while (heap.size()){auto t = heap.top();heap.pop();int ver = t.y.y, distance = t.y.x;cnt[ver] ++ ;if (cnt[T] == K) return distance;for (int i = h[ver]; ~i; i = ne[i]){int j = e[i];if (cnt[j] < K)//剪枝的操作,每一个点肯定不能走超过K次heap.push({distance + w[i] + dist[j], {distance + w[i], j}});}}return -1;
}int main()
{scanf("%d%d", &n, &m);memset(h, -1, sizeof h);memset(rh, -1, sizeof rh);for (int i = 0; i < m; i ++ ){int a, b, c;cin >> a >> b >> c;add(h, a, b, c), add(rh, b, a, c);//建图时候注意是A——B,然后B——A}cin >> S >> T >> K;if (S == T) K ++ ;// 起点==终点时 则d[S→S] = 0 这种情况就要舍去 ,总共第K大变为总共第K+1大dijkstra();cout << astar() << endl;return 0;
}

第K短路(A*算法)相关推荐

  1. 第k短路 (A*算法)

    A*算法: A*,启发式搜索,是一种较为有效的搜索方法. 我们在搜索的时候,很多时候在当前状态,已经不是最优解了,但是我们却继续求解:这个就是暴力搜索浪费时间的原因. 我们在有些时候,往往可以根据一些 ...

  2. 第k短路----A*算法

    题目链接 大佬题解:https://www.acwing.com/solution/content/21233/ #include <iostream> #include <cstr ...

  3. A*算法的认识与求第K短路模板

    现在来了解A*算法是什么 现在来解决A*求K短路问题 在一个有权图中,从起点到终点最短的路径成为最短路,第2短的路成为次短路,第3短的路成为第3短路,依此类推,第k短的路成为第k短路.那么,第k短路怎 ...

  4. ACM-ICPC 2018 沈阳赛区网络预赛 D. Made In Heaven (K短路算法模板)

    题意 : 求第k短路的权值是否超过T(权值) 解法: 网上随便找的一个求K短路的算法模板套弄一下即可 (模板要好,不然邻接表存图会TLE , 网上换了两个模板才AC的) AC代码: #include& ...

  5. POJ--2449--Remmarguts#39; Date【dijkstra_heap+A*】第K短路

    链接:http://poj.org/problem?id=2449 题意:告诉你有n个顶点,m条边,并把这些边的信息告诉你:起点.终点.权值.再告诉你s.t.k.需求出s到t的第k短路,没有则输出-1 ...

  6. k短路 k shortest path 入门

    K短路求解算法常用的有djstra + A* 和 Yen算法.本文主要讲解djstra + A* 先了解下A*中的估值函数 f(n)=g(n)+h(n) f ( n ) = g ( n ) + h ( ...

  7. [jzoj1163]第k短路

    Description Bessie 来到一个小农场,有时她想回老家看看她的一位好友.她不想太早地回到老家,因为她喜欢途中的美丽风景.她决定选择K短路径,而不是最短路径. 农村有 R (1≤R≤100 ...

  8. poj2449(k短路算法)

    K 短路问题(A* 启发式广搜) 1.k 短路问题就是最短路问题的延申,要找出第 k 短的路径.用广搜进行路径查找,第一次找到的 就是最短路,第二次找到的是第 2 短 路⋯以此类推.所以我们只需要一直 ...

  9. ACM-ICPC 2018 沈阳赛区网络预赛 D Made In Heaven(第k短路,A*算法)

    https://nanti.jisuanke.com/t/31445 题意 能否在t时间内把第k短路走完. 分析 A*算法板子. #include <iostream> #include ...

最新文章

  1. 微信支付android不弹出支付密码窗口,微信支付没弹出支付窗口
  2. 徐文尚计算机控制系统,【计算机控制系统 徐文尚】_计算机控制系统 徐文尚参考资料-毕业论文范文网...
  3. Transformer靠什么“基因“,得以闯入CV界秒杀CNN?
  4. 我们生活在一个虚拟世界的概率有多大?
  5. ES6 继承(复习原型链继承)
  6. DFTug - Architecture Your Test Design
  7. BZOJ 4706: B君的多边形 找规律
  8. 洛谷 - P4197 Peaks(Kruskal重构树+dfs序+主席树)
  9. Windows 8 C++/CX字符串
  10. 须使用visual c 内联汇编语言开发,在VisualC 中使用内联汇编
  11. dart 怎么判断function的返回值为空_R 学习-第二章第二节- 尝试写个Function,超级菜鸟教程...
  12. leetcode950. Reveal Cards In Increasing Order
  13. 网易云课堂C++开发工程师案例-网吧收银系统(MFC+ADO) C++收银...
  14. 构建Lua解释器Part3:String设计与实现
  15. matplotlib画二维分布图
  16. java maven 编辑器,Maven compiler 插件
  17. 10年过去,人们买不起旗舰机了
  18. 李佳琦转行成直播一哥,他做对了哪些事?
  19. ASP.NET Core WebApi构建API接口服务实战演练
  20. 怎样把PDF文件转换成JPG图片

热门文章

  1. 802.1X与portal的无线认证
  2. Keras Tuner自动调参工具使用入门教程
  3. python安装opencv问题解决
  4. 排序算法——快速排序(图解+代码)
  5. Vue项目webpack打包部署到服务器
  6. “Random“ objects should be reused解决 Random() 低效问题
  7. 【思维模型】五分钟了解<乔哈里窗>,为什么学习乔哈里窗?什么是乔哈里窗?怎么应用乔哈里窗?
  8. Head First Java(中文版)pdf
  9. S32DS中.ld(链接)文件学习
  10. Linux sed按行遍历文件内容,并删除匹配成功的行