题目链接:Path
这不是求k短路吗?那直接A算法。仔细一看起点不固定。那A算法是行不通了。

考虑BFS搜索。

这提和牛客多校的一道求第k小团的题很像(思想很像)。 Kth Minimum Clique可以先看看这道题。
回到题。我们先把所有边压入一个优先队列,优先队列里记录当前到达的点以及路径,每次取出路径最小的,第一次取出就是第一小,第二次取出就是第二小,第三次取出就是第三小。。。。。
然后再把取出点的所有出边压入队列。
注意
  这里我们只能保证当前取出的就是最小的,不能保证队列里的所有元素都是前k小。我们是从最小的开始bfs的,那么很显然每次取出的都是最小的。比当前元素大一点的肯定就是由队列里的某一个元素转移过去的。可以预见,队列里的某一个元素转移之后完全有可能比队列的另外某个元素更小。所以队列里的所有元素不是前k小。

可以肯定按照这种想法是没错的。只是时间上能否过得去就是个问题。牛客那题数据只是100,暴力就能过了。对于此题5e4的数据,肯定就不行了。当天写这个bfs的时候先是炸内存,后面又是tle。哎。。。。问题就出在我们每次取出点向外扩展的时候是对所有出边。那么如果出边都比较多。多次扩展之后优先队列肯定就承受不住了,而且时间上也不允许。

如何优化
  我们每次扩展的时候,其实没必要扩展所有出边。
如上图的时候。先对所有出边从小到大排序,假设有我们当前取出了v点,并且这个点是由u扩展过来的。那么对于e2,e3,e4。显然扩展他们中最小的e2就可以了。除此之外呢,其实还有一个需要扩展的地方,那就是u向e1扩展。因为对于e3,e4的扩展是比e2扩展大的,所以是没有必要的(至少当前是不需要的),而对于e1这条边我们是不确定的,所以需要加入队列。

综上:
优先队列里记录当前结点,以及路径和,以及当前结点扩展到第几条边了。每次扩展当前点的出边中最小的一条,以及扩展到当前点的点的下一条边,就是图中比e0稍微大一点的e1。

AC_CODE

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 100 * 100 * 5 + 10;
typedef pair<ll, int>PII;
vector<PII>v[N];
int n, m, k, query[N];
ll ans[N];
struct node{ll w;int st,id;bool operator<(const node a)const {return w > a.w;}
};int main() {//freopen("a.in","r",stdin);int t; scanf("%d",&t);while (t--) {scanf("%d%d%d",&n,&m,&k);for (int i = 1; i <= n; i++)v[i].clear();for (int i = 1, x, y; i <= m; i++) {ll w; scanf("%d%d%lld", &x, &y, &w);v[x].push_back({w,y});}for (int i = 1; i <= n; i++)sort(v[i].begin(),v[i].end());int mx = 0;for (int i = 1; i <= k; i++) {scanf("%d",query+i);mx = max(mx,query[i]);}priority_queue<node>q;for (int i = 1; i <= n; i++) {if (v[i].size())q.push({v[i][0].first,i,0});}int cnt = 0;while (true) {ll w = q.top().w;int st = q.top().st, id = q.top().id;q.pop();ans[++cnt] = w;if (cnt == mx)break;if (id+1 < (int)v[st].size())q.push({w-v[st][id].first+v[st][id+1].first,st,id+1});int y = v[st][id].second;if (v[y].size())q.push({w+v[y][0].first,y,0});}for (int i = 1; i <= k; i++)printf("%lld\n",ans[query[i]]);}return 0;
}

k短路(HDU6705)相关推荐

  1. HDU6181(K短路问题)

    不知道为什么这个一直爆内存! #include<iostream> #include<algorithm> #include<cmath> #include< ...

  2. poj2449(k短路算法)

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

  3. POJ 2449 Remmarguts' Date(第K短路 + A* + 最短路)题解

    题意:找出第k短路,输出长度,没有输出-1 思路:这题可以用A*做.A*的原理是这样,我们用一个函数:f = g + h 来表示当前点的预期步数,f代表当前点的预期步数,g代表从起点走到当前的步数,h ...

  4. 第K短路模板【POJ2449 / 洛谷2483 / BZOJ1975 / HDU6181】

    1.到底如何求k短路的? 我们考虑,要求k短路,要先求出最短路/次短路/第三短路--/第(k-1)短路,然后访问到第k短路. 接下来的方法就是如此操作的. 2.f(x)的意义? 我们得到的f(x)更小 ...

  5. BZOJ1975 [Sdoi2010]魔法猪学院 k短路

    欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1975 题意概括 给出一个无向图,让你走不同的路径,从1到n,路径长度之和不超过E,求最大路径条数. ...

  6. POJ 2449 Remmarguts' Date(k短路模板)

    link:https://vjudge.net/problem/POJ-2449 前面输入与大多最短路题相同 最后一行输入s,t,k 求从s到t的第K短路 wiki link: https://en. ...

  7. 【USACO Mar08】 奶牛跑步 A-star k短路

    Description Bessie准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘,然后走回牛棚. Bessie也不想跑得太远,所以她想走最短的路经. 农场上一共有M( ...

  8. poj 2449 A*求k短路

    A*的入门题目,需要注意的是当图中只有一个点的时候k短路是不存在的. 1 #include <iostream> 2 #include <cstring> 3 #include ...

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

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

最新文章

  1. WordPress插件开发: 文章同步到OSC博客插件(OscPress) (四)
  2. volatile: 多线程程序员最好的朋友
  3. jquery动态加载问题
  4. Spark详解(八):Spark 容错以及高可用性HA
  5. 2018.09.24-2018.09.30
  6. 一名新晋程序员的自述:我的编程自学之路
  7. GitHub for Windows使用教程(二) 分支的使用
  8. linux修改ip广播地址,Linux设置查看静态IP之ifconfig命令
  9. linux 关机命令总结
  10. 永辉生活APP卖茅台只收款不发货,永辉超市回应...
  11. 手机不小心把计算机隐藏了怎么恢复,任务栏被隐藏如何恢复?
  12. nodejs的简单爬虫
  13. MYSQL复习笔记12-视图
  14. php swool 聊天室,swoole简单的聊天室demo(修正版)
  15. 与计算机博弈相关的学术论文,爱恩斯坦棋计算机博弈系统的研究与实现计算机应用技术专业论文.docx...
  16. 网络转载的小波框架总结
  17. C++实现超简单的文件加密
  18. python基础学习记录
  19. 蓝桥杯scratch集训操作题:绘制蜘蛛网
  20. 【手写信息搜集工具】ThunderSearch 闪电搜索器

热门文章

  1. 前端请求接口报405错误
  2. android应用获取手机存储空间方法
  3. Android 仿微信红包动画 平移动画
  4. 如何利用R语言处理 缺失值 数据
  5. android什么意思!读完我这份《Android开发核心源码精编解析》面试至少多要3K!面试建议
  6. 利用开区间覆盖的约简给出有限覆盖定理的一个新证明
  7. 计算机模拟仿真实例,计算机模拟仿真系统,computer simulation system,音标,读音,翻译,英文例句,英语词典...
  8. 迪杰斯特拉--链式向前星
  9. js 获取所有被选中复选框的值
  10. 国民技术 MCU JLink仿真调试环境配置