题目大意

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. javaweb基础(19)_jsp标签

    一.JSP标签介绍 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 二.JSP常用标签 ...

  2. Linux centos 6 配置php环境,扩展redis

    1.首先安装一个虚拟机(我自己版本:VM 10.0.4) yum -y install openssl psmisc openssl-devel php-devel pcre-devel gcc gc ...

  3. TCP/UDP 协议介绍

    TCP/IP五层网络结构模型 物理层:物理层建立在物理通信介质的基础上,作为系统和通信介质的接口,用来实现数据链路实体间透明的比特 (bit) 流传输.只有该层为真实物理通信,其它各层为虚拟通信 数据 ...

  4. bug汇总

    bug 2018年8月23日 bug 1:散点图画不出来. plt.scatter(validation_examples["longitude"], validation_exa ...

  5. Golang 简单 http 代理转发

    程序基本实现了对http的完整转发,目前暂不支持https windows需要在设置中的网络>代理设置为手动,并开启代理服务器,填写ip和端口 // httpForward package ma ...

  6. 阿里云全国快递物流查询api接口

    口地址: https://market.aliyun.com/products/56928004/cmapi021863.html?spm=5176.730005.productlist.d_cmap ...

  7. (转)rvm安装与常用命令

    rvm是一个命令行工具,可以提供一个便捷的多版本ruby环境的管理和切换. https://rvm.io/ 如果你打算学习ruby/rails, rvm是必不可少的工具之一. 这里所有的命令都是再用户 ...

  8. linux系统装载ELF过程

    参考:程序员的自我修养 fork -->execve() //----kenerl space--------------- sys_execve() /*arch\i386\kernel\pr ...

  9. MyCAT+MySQL 搭建高可用企业级数据库集群——第3章 MyCat核心配置讲解

    3-1 章节综述 3-2 常用配置文件间的关系 3-3 server.xml配置详解 3-4 log4j2.xml配置文件 3-5 rule.xml 3-6 常用分片算法(上) 3-7 常用分片算法( ...

  10. 排序算法总结 c描述

    概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大, ...