A* k短路 学习笔记
题目大意
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短路 学习笔记的更多相关文章
- K短路 学习笔记
K短路,顾名思义,是让你求从$s$到$t$的第$k$短的路. 暴力当然不可取,那么我们有什么算法可以解决这个问题? -------------------------- 首先,我们要维护一个堆. st ...
- 【学习笔记】K 短路问题详解
\(k\) 短路问题简介 所谓"\(k\) 短路"问题,即给定一张 \(n\) 个点,\(m\) 条边的有向图,给定起点 \(s\) 和终点 \(t\),求出所有 \(s\to t ...
- bzoj 1598: [Usaco2008 Mar]牛跑步 [k短路 A*] [学习笔记]
1598: [Usaco2008 Mar]牛跑步 题意:k短路 ~~貌似A*的题目除了x数码就是k短路~~ \[ f(x) = g(x) + h(x) \] \(g(x)\)为到达当前状态实际代价,\ ...
- [原创]java WEB学习笔记71:Struts2 学习之路-- struts2常见的内建验证程序及注意点,短路验证,非字段验证,错误消息的重用
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- 算法笔记--次小生成树 && 次短路 && k 短路
1.次小生成树 非严格次小生成树:边权和小于等于最小生成树的边权和 严格次小生成树: 边权和小于最小生成树的边权和 算法:先建好最小生成树,然后对于每条不在最小生成树上的边(u,v,w)如果我们 ...
- 学习笔记之Java程序设计实用教程
Java程序设计实用教程 by 朱战立 & 沈伟 学习笔记之JAVA多线程(http://www.cnblogs.com/pegasus923/p/3995855.html) 国庆休假前学习了 ...
- kruskal重构树学习笔记
\(kruskal\) 重构树学习笔记 前言 \(8102IONCC\) 中考到了,本蒟蒻不会,所以学一下. 前置知识 \(kruskal\) 求最小(大)生成树,树上求 \(lca\). 算法详 ...
- Day 4 学习笔记 各种图论
Day 4 学习笔记 各种图论 图是什么???? 不是我上传的图床上的那些垃圾解释... 一.图: 1.定义 由顶点和边组成的集合叫做图. 2.分类: 边如果是有向边,就是有向图:否则,就是无向图. ...
- OI知识点|NOIP考点|省选考点|教程与学习笔记合集
点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...
随机推荐
- iOS--获取文件目录的方法
很多文章都有写这个问题,我只是为了记录一下,免得总翻书... 1.Documents 目录: 你应该将所有的应用程序数据文件写入到这个目录下.这个目录用于存储用户数据或其它应该定期备份的信息. 2.L ...
- 配置淘宝镜像,不使用怪异的cnpm
npm config set registry https://registry.npm.taobao.org --global npm config set disturl https://npm. ...
- VB6 代码编辑页面添加支持滚轮模式
VB6 中的代码编辑页面默认是不支持滚轮模式的,这让在编辑代码时的体验很是不爽. 但在64位win10系统进行加载配置时,可能会出现问题,可用如下方法解决: http://download.micro ...
- Linux下打包解压命令
tar 压缩: tar -cvjpf etc.tar.bz2 /etc //-c为创建一个打包文件,相应的-f后面接创建的文件的名称,使用了.tar.bz2后缀,-j标志使用bzip2压缩,最后面为具 ...
- biological clock--class
'''this application aimed to cauculate people's biological block about emotional(28), energy(23),int ...
- Python使用gevent实现协程
Python中多任务的实现可以使用进程和线程,也可以使用协程. 一.协程介绍 协程,又称微线程.英文名Coroutine.协程是Python语言中所特有的,在其他语言中没有. 协程是python中另外 ...
- python 面对对象基础
目录 面向对象基础 面向对象编程(抽象) 类与对象 给对象定制独有的特征 对象的属性查找顺序 类与对象的绑定方法 类与数据类型 对象的高度整合 面向对象基础 面向对象编程(抽象) 回顾一下 面向过程编 ...
- 有关git clone 下载速度变慢的解决方法
使用提示:请注意一下,以下方法是在搭有梯子的情况下进行的,也就是说在有梯子的情况下,下载速度始终很慢,使用了以下方法用梯子下载达到正常速度,并没有尝试修复过后不用梯子下载. 所以,如果使用了以下方法, ...
- drf 视图功能
视图 drf提供的视图功能 自己的第一次封装 #一个功能写成一个类,方便组合,只要继承它就可以有这个功能 #将功能都写在一个类中,可控性就会变差 from book.myserializers imp ...
- 打印机增强软件pdfpro
http://3dx.pc6.com/gm1/pdfpro.zip