题目大意

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. QT5:介绍

    一.简介 QT是一个跨平台的C++开发库,主要用来开发图形用户界面(Graphical User Interface,GUI) QT除了可以绘制漂亮的界面(包括控件/布局/交互),还可以多线程/访问数 ...

  2. 01_3_查询指定id的单个对象

    01_3_查询指定id的单个对象 1. 映射文件配置如下信息 <select id="selectStudentById" resultClass="Student ...

  3. sql where in字符串问题

    在pycharm中执行 select * from value in(1,2); 会提醒: No statement found under the caret. Execute all statem ...

  4. 关于web安全--CSRF和XSS

    CSRF:跨站请求伪造. 攻击原理:一个用户登陆了可信的网站A,身份验证后A会下发一个cookie:此时用户又打开了另一个危险网站B,B引诱用户点击连接(该链接会访问A的接口),由于此时会携带cook ...

  5. vector总结(更新中。。。)

    vector中这两个属性很容易弄混淆. size是当前vector容器真实占用的大小,也就是容器当前拥有多少个容器. capacity是指在发生realloc前能允许的最大元素数,即预分配的内存空间. ...

  6. NOIP模拟赛 高级打字机

    [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作: 1.T x:在文章末尾打下一个小写字母x. ...

  7. php 计算当天凌晨时间戳 以及获取其他常用时间戳

    php 计算当日凌晨时间戳 以及获取其他常用时间戳(持续补充中...) 获取当天凌晨时间戳: echo strtotime(date('Y-m-d')); 以下再列举一些获取其他常用时间戳的方法 获取 ...

  8. 使用laravel框架的eloquent\DB模型连接多个数据库

    1.配置.env文件 DB_HOST_TRAILER=127.0.0.1DB_PORT_TRAILER=3306DB_DATABASE_TRAILER=htms_trailerDB_USERNAME_ ...

  9. 【linux】【进程】stand alone 与 super daemon 区别

    本文引用自  鸟哥的linux私房菜如果依据 daemon 的启动与管理方式来区分,基本上,可以将 daemon 分为可独立启动的 stand alone , 与透过一支 super daemon 来 ...

  10. Python基础:字符串(string)

    字符串的常用操作 字符串与数组一样,支持索引操作.切片与遍历 索引.切片操作: name = 'jason' name[0] 'j' name[1:3] 'as' 遍历: for char in na ...