题目大意

n个点,m条边有向图,给定S,T,求不严格k短路

n<=1000 m<=100000 k<=1000

不用LL

分析

A*算法

f(i)表示从S出发经过i到T的估价函数

\(f(i)=g(i)+h(i)\)

g(i)表示S-i的实际代价

h(i)表示i-T的估计代价

要保证h(n)小于等于n到t的实际代价

本题中h(i)估价用逆图dijkstra一波直接求i-T最短路径作为估价

然后从S开始按照f为关键字用堆优化搜索

其实写法是类似于dijkstra的

不难从f(i)如果出现了K+1短,K+1短及之后都可以不要的

所以记录cnt[i]

每个点i出队一次,就找到了第++cnt[i]个f(i)

当T第k次出队就是答案

注意

dijkstra和Astar是可以共用一个结构体进行堆优化的

solution

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <cctype>
  6. #include <algorithm>
  7. #include <queue>
  8. using namespace std;
  9. const int N=1007;
  10. const int M=100007;
  11. inline int rd(){
  12. int x=0;bool f=1;char c=getchar();
  13. for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
  14. for(;isdigit(c);c=getchar()) x=x*10+c-48;
  15. return f?x:-x;
  16. }
  17. int n,m;
  18. int S,K,T;
  19. int g[N],te;
  20. int hd[N],tb;
  21. struct edge{
  22. int y,d,next;
  23. }e[M<<1],bck[M<<1];
  24. void addedge(int x,int y,int z){
  25. e[++te].y=y;e[te].d=z;e[te].next=g[x];g[x]=te;
  26. }
  27. void addbck(int x,int y,int z){
  28. bck[++tb].y=y;bck[tb].d=z;bck[tb].next=hd[x];hd[x]=tb;
  29. }
  30. struct node{
  31. int id,g,f;
  32. node(int ii=0,int gg=0,int ff=0){id=ii;g=gg;f=ff;}
  33. bool operator < (node b) const{
  34. return f>b.f;
  35. }
  36. };
  37. priority_queue<node>q;
  38. int h[N],vis[N];
  39. void dijkstra(){
  40. q.push(node(T,0,0));
  41. memset(h,127,sizeof(h));
  42. h[T]=0;
  43. int x,p,y;
  44. node nw;
  45. while(!q.empty()){
  46. nw=q.top();q.pop();
  47. x=nw.id;
  48. if(vis[x]) continue;
  49. vis[x]=1;
  50. for(p=hd[x];p;p=bck[p].next){
  51. y=bck[p].y;
  52. if(h[x]+bck[p].d<h[y]){
  53. h[y]=h[x]+bck[p].d;
  54. q.push(node(y,0,h[y]));
  55. }
  56. }
  57. }
  58. }
  59. int cnt[N];
  60. bool Astar(){
  61. q.push(node(S,0,h[S]));
  62. int x,p,y;
  63. node nw;
  64. while(!q.empty()){
  65. nw=q.top();q.pop();
  66. x=nw.id;
  67. cnt[x]++;
  68. if(cnt[x]==K&&x==T){
  69. printf("%d\n",nw.f);
  70. return 1;
  71. }
  72. if(cnt[x]>K) continue;
  73. for(p=g[x];p;p=e[p].next){
  74. y=e[p].y;
  75. q.push(node(y,nw.g+e[p].d,nw.g+e[p].d+h[y]));
  76. }
  77. }
  78. return 0;
  79. }
  80. int main(){
  81. int i,x,y,z;
  82. n=rd(),m=rd();
  83. for(i=1;i<=m;i++){
  84. x=rd(),y=rd(),z=rd();
  85. addedge(x,y,z);
  86. addbck(y,x,z);
  87. }
  88. S=rd(),T=rd(),K=rd();
  89. dijkstra();
  90. if(Astar()==0) puts("-1");
  91. return 0;
  92. }

A* k短路 学习笔记的更多相关文章

  1. K短路 学习笔记

    K短路,顾名思义,是让你求从$s$到$t$的第$k$短的路. 暴力当然不可取,那么我们有什么算法可以解决这个问题? -------------------------- 首先,我们要维护一个堆. st ...

  2. 【学习笔记】K 短路问题详解

    \(k\) 短路问题简介 所谓"\(k\) 短路"问题,即给定一张 \(n\) 个点,\(m\) 条边的有向图,给定起点 \(s\) 和终点 \(t\),求出所有 \(s\to t ...

  3. bzoj 1598: [Usaco2008 Mar]牛跑步 [k短路 A*] [学习笔记]

    1598: [Usaco2008 Mar]牛跑步 题意:k短路 ~~貌似A*的题目除了x数码就是k短路~~ \[ f(x) = g(x) + h(x) \] \(g(x)\)为到达当前状态实际代价,\ ...

  4. [原创]java WEB学习笔记71:Struts2 学习之路-- struts2常见的内建验证程序及注意点,短路验证,非字段验证,错误消息的重用

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  5. 算法笔记--次小生成树 && 次短路 && k 短路

    1.次小生成树 非严格次小生成树:边权和小于等于最小生成树的边权和 严格次小生成树:    边权和小于最小生成树的边权和 算法:先建好最小生成树,然后对于每条不在最小生成树上的边(u,v,w)如果我们 ...

  6. 学习笔记之Java程序设计实用教程

    Java程序设计实用教程 by 朱战立 & 沈伟 学习笔记之JAVA多线程(http://www.cnblogs.com/pegasus923/p/3995855.html) 国庆休假前学习了 ...

  7. kruskal重构树学习笔记

    \(kruskal\) 重构树学习笔记 前言 \(8102IONCC\) 中考到了,本蒟蒻不会,所以学一下. 前置知识 \(kruskal​\) 求最小(大)生成树,树上求 \(lca​\). 算法详 ...

  8. Day 4 学习笔记 各种图论

    Day 4 学习笔记 各种图论 图是什么???? 不是我上传的图床上的那些垃圾解释... 一.图: 1.定义 由顶点和边组成的集合叫做图. 2.分类: 边如果是有向边,就是有向图:否则,就是无向图. ...

  9. OI知识点|NOIP考点|省选考点|教程与学习笔记合集

    点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...

随机推荐

  1. Dede常用标记

    http://fontawesome.dashgame.com/ 字体图标使用方法 http://www.iconfont.cn/ 阿里的图标库 https://icomoon.io/ 字体制作 时间 ...

  2. ssh整合思想 Spring与Hibernate的整合ssh整合相关JAR包下载 .MySQLDialect方言解决无法服务器启动自动update创建表问题

    除之前的Spring相关包,还有structs2包外,还需要Hibernate的相关包 首先,Spring整合其他持久化层框架的JAR包 spring-orm-4.2.4.RELEASE.jar  ( ...

  3. VueX源码分析(1)

    VueX源码分析(1) 文件架构如下 /module /plugins helpers.js index.esm.js index.js store.js util.js util.js 先从最简单的 ...

  4. STL 之 sort 函数使用方法

    关于Sort Sort函数是C++ STL(Standard Template Library / 标准函数库) <algorithm>头文件中的一个排序函数,作用是将一系列数进行排序,因 ...

  5. 基于idea创建Tomcat远程调试

    编辑完catalina文件后重启tomcat

  6. vue组件:canvas实现图片涂鸦功能

    方案背景 需求 需要对图片进行标注,导出图片. 需要标注N多图片最后同时保存. 需要根据多边形区域数据(区域.颜色.名称)标注. 对应方案 用canvas实现涂鸦.圆形.矩形的绘制,最终生成图片bas ...

  7. jQuery获取动态添加的元素,live和on的区别

    今天给大家说一下如果用jQuery获取动态添加的元素,通常如果你在网页上利用jQuery添加一个元素,那么用平常的jQuery获取元素的方法无效的获取不到的.可以用以下的方法获取动态元素!假设我们现在 ...

  8. 使用nohup+& 踩到的坑

    首先分清楚nohup与&: &是指在后台运行一般在执行命令后,都会显式的在前台执行,当Ctrl+C后进程回宕掉,但是 在命令后加&,即使Ctrl+C,程序还在进行,但是,当关闭 ...

  9. nrf开发笔记一开发软件

    nrf52810 的开发环境,比较主流的可以使用keil,iar亦可.sdk中,使用的是pca10040e,s112.虽然开发板共用一个型号(pca10040) keil5中,cmsis 需要4.5. ...

  10. iOS 中的视图函数 init initwithnib viewDidLoad viewWillAppear的总结

    我要总结的函数主要是这几个: UIView *view-如果view还没有被初始化的话,getter方法会先调用[self loadView],如果getter或者setter方法被重写了,子类中的g ...