简介

Dijkstra最短路+A*搜索.

先逆向求所有点到终点的最短路 \(dis[i]\).

定义估价函数 \(f[i] = d[i] + dis[i]\) , 其中 \(d[i]\) 表示当前起点到 \(i\) 点的路径长度, 则 \(f[i]\) 表示一条从 \(u\) 到 \(v\) 经过 \(i\) 点的路径长度.

与Dijkstra算法类似, 将 \(f[i]\) 放到堆中, 每次求出 \(f[i]\) 最小的节点 \(u\) , 维护相邻节点 \(v\) :

\[d[v] = d[u] + val(u,v)
\]

\[ f[v] = f[u] - dis[u] + dis[v] + val(u,v) $$.

当第 $k$ 次 $u$ 为终点, $f[u]$ 即为起点到终点的第 $k$ 短路.

### 代码
```
//the nth point is departure, 1st is destination

const int nsz=1050,msz=10050;
const ll ninf=1e16;
int n,m,k;
struct te{int t,pr,v;}edge[msz*2];
int hd[nsz],pe=1;
void adde(int f,int t,int v){edge[++pe]=(te){t,hd[f],v};hd[f]=pe;}
void addsg(int f,int t,int v){adde(f,t,v);adde(t,f,-1);}

ll dis[nsz],vi[nsz];
struct tnd{ll p,d;};
bool operator<(tnd l,tnd r){return l.d>r.d;}
priority_queue<tnd> pq;
void dij(int f){
rep(i,1,n)dis[i]=ninf;
dis[f]=0;
pq.push((tnd){f,0});
while(!pq.empty()){
int u=pq.top().p;pq.pop();
if(vi[u])continue;
for(int i=hd[u],v=edge[i].t;i;i=edge[i].pr,v=edge[i].t){
if(edge[i].v!=-1)continue;//inv edge
if(dis[v]>dis[u]+edge[i^1].v)dis[v]=dis[u]+edge[i^1].v,pq.push((tnd){v,dis[v]});
}
}
// rep(i,1,n)cout<<dis[i]<<'\n';
}
ll ans[nsz],pa=0;
void astar(){
if(dis[n]>=ninf)return;
pq.push((tnd){n,dis[n]});
while(!pq.empty()){
ll u=pq.top().p,d=pq.top().d;pq.pop();
if(u==1){
ans[++pa]=d;
if(pa==k)break;
continue;
}
for(int i=hd[u],v=edge[i].t;i;i=edge[i].pr,v=edge[i].t){
if(edge[i].v==-1)continue;
pq.push((tnd){v,d-dis[u]+dis[v]+edge[i].v});
}
}
}

//use
dij(1);
while(!pq.empty())pq.pop();
astar();
```\]

[模板] k短路的更多相关文章

  1. 洛谷 [P2483] [模板] k短路

    人生中的第一道黑题... 其实就是k短路模板 #include <iostream> #include <cstdio> #include <cstring> #i ...

  2. P2483 【模板】k短路([SDOI2010]魔法猪学院)

    题目背景 感谢@kczno1 @X_o_r 提供hack数据 题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界 ...

  3. POJ 2449Remmarguts' Date K短路模板 SPFA+A*

    K短路模板,A*+SPFA求K短路.A*中h的求法为在反图中做SPFA,求出到T点的最短路,极为估价函数h(这里不再是估价,而是准确值),然后跑A*,从S点开始(此时为最短路),然后把与S点能达到的点 ...

  4. k短路模板 POJ2449

    采用A*算法的k短路模板 #include <iostream> #include <cstdio> #include <cstring> #include < ...

  5. 沈阳网络赛D-Made In Heaven【k短路】【模板】

    One day in the jail, F·F invites Jolyne Kujo (JOJO in brief) to play tennis with her. However, Pucci ...

  6. UESTC - 1987 童心未泯的帆宝和乐爷 (第k短路 A*算法+SPFA算法 模板)

    传送门: http://www.qscoj.cn/#/problem/show/1987 童心未泯的帆宝和乐爷 Edit Time Limit: 10000 MS     Memory Limit: ...

  7. ACM-ICPC 2018 沈阳赛区网络预赛 D. Made In Heaven(第k短路模板)

    求第k短路模板 先逆向求每个点到终点的距离,再用dij算法,不会超时(虽然还没搞明白为啥... #include<iostream> #include<cstdio> #inc ...

  8. [poj2449]Remmarguts' Date(K短路模板题,A*算法)

    解题关键:k短路模板题,A*算法解决. #include<cstdio> #include<cstring> #include<algorithm> #includ ...

  9. poj2449(k短路&A_star模板)

    题目链接:http://poj.org/problem?id=2449 题意:给出一个有向图,求s到t的第k短路: 思路:k短路模板题,可以用A_star模板过: 单源点最短路径+高级搜索A*;A*算 ...

随机推荐

  1. Python数据类型(python3)

    Python数据类型(python3) 基础数据类型 整型 <class 'int'> 带符号的,根据机器字长32位和64位表示的范围不相同,分别是: -2^31 - 2^31-1 和 - ...

  2. WebStorm 配置微信小程序开发 用html样式打开wxml 用css样式打开wxss 配置微信小程序提醒

    1.点开preferences 2.搜索找到“File Types” 3.找到"HTML",点击“+”按钮,添加“*.wxml”然后“apply” 4.和3一样,再找到 ‘casc ...

  3. 我想要革命想要解脱——bootstrap常见问题及解决方式

    最近一个月,恍若隔世,天天加班,昨晚终于发版了,今天才喘一口气.有时候,即便你工作效率再怎么高,撸码再怎么快也无可避免的会加班.不信的话,可以先给你定一个交付时间,然后不断的给你加需求,就让你一个人做 ...

  4. OpenUDID 和 IDFA 比较

    iOS标识符 现今来比较下,不同情况下两种标识符的变化情况.以下试验,每种标识符均分为存于Keychain和未存于Keychain的两种情况做比较. 广告标识符(IDFA-identifierForI ...

  5. Docker Data Center系列(一)- 快速搭建云原生架构的实践环境

    本系列文章演示如何快速搭建一个简单的云原生架构的实践环境. 基于这个基础架构,可以持续部署微服务架构的应用栈,演练敏捷开发过程,提升DevOps实践能力. 1 整体规划 1.1 拓扑架构 1.2 基础 ...

  6. Linux 环境下 Git 安装与基本配置

    索引: 目录索引 参看代码 GitHub: git.txt 一.Linux (DeepinOS) 环境 1.安装 sudo apt-get update sudo apt-get install gi ...

  7. windows 服务中托管asp.net core

    在windows 服务中托管asp.net core SDK 2.1.300 官方示例 1.添加运行标识符 xml <PropertyGroup> <TargetFramework& ...

  8. 06-Nodejs介绍

    06-Nodejs介绍 打开Nodejs英文网:https://nodejs.org/en/ 中文网:http://nodejs.cn/ 我们会发现这样一句话: 翻译成中文如下: Node.js 是一 ...

  9. iOS中图片拉伸,类似Android中的点9图片

    UIImage* img=[UIImage imageNamed:@"name.png"];//原图 UIEdgeInsets edge=UIEdgeInsetsMake(, , ...

  10. Canvas中的非零环绕

    先上图 当要填充图形时,必须区分开哪些部分是覆盖的,哪些是空的,根据绘制的方向可以判断出来 非零环绕规则:对于路径中指定范围区域,从该区域内部画一条足够长的线段,使此线段的完全落在路径范围之外. 非零 ...