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(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...
随机推荐
- WINDOWS-基础:SafeArray的使用方法
1 SafeArray的作用 使用SafeArray SafeArray是VB中的数组存储方式.通过SafeArray,可以在VC++和VB间相互调用. SafeArray也是Automation中的 ...
- 实验十二 团队作业8:软件测试与Alpha冲刺
实验十二 团队作业8:软件测试与Alpha冲刺 实验时间 2018-6-13 Deadline: [6.13-6.19]之间任选连续5天的23:00,以团队随笔博文提交时间为准. 评分标准: 按时交 ...
- 标签中的name属性和ID属性的区别
标签中的name属性和ID属性的区别 2018年05月13日 10:17:44 tssit 阅读数:760 编程这么久,细想了一下,发现这个问题还不是很清楚,汗!看了几篇文章,整理了一下,分享下! ...
- 《剑指offer》56 数组中只出现一次的数字
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 在线练习:https://www.nowcoder.com/practice/e02fdb5 ...
- cocos2dx for lua 简单的翻牌动画
local x = 20 local y = display.height/2 for i = 1,16 do--创建16张 local cardFg = display.newSprite(&quo ...
- 看了下opengl相关的资料,踩了一个坑,记录一下
2019/03/10 下午看了下关于opengl的资料,然后把敲了下代码,然后程序报错了.代码如下: #include <glad/glad.h> #include <GLFW/gl ...
- pandas实践——美国人口分析
1.导入文件,并查看数据样本 abbr = pd.read_csv("./state-abbrevs.csv")areas =pd.read_csv("./state-a ...
- Linux - mkdir -p a/b/c
mkdir -p a/b/c -p 会循环创建
- Angular - Can't bind to 'ngModel' since it isn't a known property of 'input'.
用[(ngModel)]="xxx"双向绑定,如:控制台报错:Can't bind to 'ngModel' since it isn't a known property of ...
- 反爬虫之搭建IP代理池
反爬虫之搭建IP代理池 听说你又被封 ip 了,你要学会伪装好自己,这次说说伪装你的头部.可惜加了header请求头,加了cookie 还是被限制爬取了.这时就得祭出IP代理池!!! 下面就是requ ...