题目大意

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

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
#include <queue>
using namespace std;
const int N=1007;
const int M=100007; inline int rd(){
int x=0;bool f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(;isdigit(c);c=getchar()) x=x*10+c-48;
return f?x:-x;
} int n,m;
int S,K,T;
int g[N],te;
int hd[N],tb;
struct edge{
int y,d,next;
}e[M<<1],bck[M<<1]; void addedge(int x,int y,int z){
e[++te].y=y;e[te].d=z;e[te].next=g[x];g[x]=te;
} void addbck(int x,int y,int z){
bck[++tb].y=y;bck[tb].d=z;bck[tb].next=hd[x];hd[x]=tb;
} struct node{
int id,g,f;
node(int ii=0,int gg=0,int ff=0){id=ii;g=gg;f=ff;}
bool operator < (node b) const{
return f>b.f;
}
}; priority_queue<node>q; int h[N],vis[N]; void dijkstra(){
q.push(node(T,0,0));
memset(h,127,sizeof(h));
h[T]=0; int x,p,y;
node nw;
while(!q.empty()){
nw=q.top();q.pop();
x=nw.id;
if(vis[x]) continue;
vis[x]=1;
for(p=hd[x];p;p=bck[p].next){
y=bck[p].y;
if(h[x]+bck[p].d<h[y]){
h[y]=h[x]+bck[p].d;
q.push(node(y,0,h[y]));
}
}
}
} int cnt[N]; bool Astar(){
q.push(node(S,0,h[S]));
int x,p,y;
node nw;
while(!q.empty()){
nw=q.top();q.pop();
x=nw.id;
cnt[x]++;
if(cnt[x]==K&&x==T){
printf("%d\n",nw.f);
return 1;
}
if(cnt[x]>K) continue;
for(p=g[x];p;p=e[p].next){
y=e[p].y;
q.push(node(y,nw.g+e[p].d,nw.g+e[p].d+h[y]));
}
}
return 0;
} int main(){
int i,x,y,z;
n=rd(),m=rd();
for(i=1;i<=m;i++){
x=rd(),y=rd(),z=rd();
addedge(x,y,z);
addbck(y,x,z);
}
S=rd(),T=rd(),K=rd();
dijkstra();
if(Astar()==0) puts("-1");
return 0;
}

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. iOS--获取文件目录的方法

    很多文章都有写这个问题,我只是为了记录一下,免得总翻书... 1.Documents 目录: 你应该将所有的应用程序数据文件写入到这个目录下.这个目录用于存储用户数据或其它应该定期备份的信息. 2.L ...

  2. 配置淘宝镜像,不使用怪异的cnpm

    npm config set registry https://registry.npm.taobao.org --global npm config set disturl https://npm. ...

  3. VB6 代码编辑页面添加支持滚轮模式

    VB6 中的代码编辑页面默认是不支持滚轮模式的,这让在编辑代码时的体验很是不爽. 但在64位win10系统进行加载配置时,可能会出现问题,可用如下方法解决: http://download.micro ...

  4. Linux下打包解压命令

    tar 压缩: tar -cvjpf etc.tar.bz2 /etc //-c为创建一个打包文件,相应的-f后面接创建的文件的名称,使用了.tar.bz2后缀,-j标志使用bzip2压缩,最后面为具 ...

  5. biological clock--class

    '''this application aimed to cauculate people's biological block about emotional(28), energy(23),int ...

  6. Python使用gevent实现协程

    Python中多任务的实现可以使用进程和线程,也可以使用协程. 一.协程介绍 协程,又称微线程.英文名Coroutine.协程是Python语言中所特有的,在其他语言中没有. 协程是python中另外 ...

  7. python 面对对象基础

    目录 面向对象基础 面向对象编程(抽象) 类与对象 给对象定制独有的特征 对象的属性查找顺序 类与对象的绑定方法 类与数据类型 对象的高度整合 面向对象基础 面向对象编程(抽象) 回顾一下 面向过程编 ...

  8. 有关git clone 下载速度变慢的解决方法

    使用提示:请注意一下,以下方法是在搭有梯子的情况下进行的,也就是说在有梯子的情况下,下载速度始终很慢,使用了以下方法用梯子下载达到正常速度,并没有尝试修复过后不用梯子下载. 所以,如果使用了以下方法, ...

  9. drf 视图功能

    视图 drf提供的视图功能 自己的第一次封装 #一个功能写成一个类,方便组合,只要继承它就可以有这个功能 #将功能都写在一个类中,可控性就会变差 from book.myserializers imp ...

  10. 打印机增强软件pdfpro

     http://3dx.pc6.com/gm1/pdfpro.zip