[模板] k短路
简介
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\) :
\]
则
当第 $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短路的更多相关文章
- 洛谷 [P2483] [模板] k短路
人生中的第一道黑题... 其实就是k短路模板 #include <iostream> #include <cstdio> #include <cstring> #i ...
- P2483 【模板】k短路([SDOI2010]魔法猪学院)
题目背景 感谢@kczno1 @X_o_r 提供hack数据 题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界 ...
- POJ 2449Remmarguts' Date K短路模板 SPFA+A*
K短路模板,A*+SPFA求K短路.A*中h的求法为在反图中做SPFA,求出到T点的最短路,极为估价函数h(这里不再是估价,而是准确值),然后跑A*,从S点开始(此时为最短路),然后把与S点能达到的点 ...
- k短路模板 POJ2449
采用A*算法的k短路模板 #include <iostream> #include <cstdio> #include <cstring> #include < ...
- 沈阳网络赛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 ...
- UESTC - 1987 童心未泯的帆宝和乐爷 (第k短路 A*算法+SPFA算法 模板)
传送门: http://www.qscoj.cn/#/problem/show/1987 童心未泯的帆宝和乐爷 Edit Time Limit: 10000 MS Memory Limit: ...
- ACM-ICPC 2018 沈阳赛区网络预赛 D. Made In Heaven(第k短路模板)
求第k短路模板 先逆向求每个点到终点的距离,再用dij算法,不会超时(虽然还没搞明白为啥... #include<iostream> #include<cstdio> #inc ...
- [poj2449]Remmarguts' Date(K短路模板题,A*算法)
解题关键:k短路模板题,A*算法解决. #include<cstdio> #include<cstring> #include<algorithm> #includ ...
- poj2449(k短路&A_star模板)
题目链接:http://poj.org/problem?id=2449 题意:给出一个有向图,求s到t的第k短路: 思路:k短路模板题,可以用A_star模板过: 单源点最短路径+高级搜索A*;A*算 ...
随机推荐
- asp.net core webapi/website+Azure DevOps+GitHub+Docker
asp.net core webapi/website+Azure DevOps+GitHub+Docker 新春开篇作,主要写一下关于asp.net core web/api 2.2 项目借助dev ...
- c/c++ 继承与多态 容器与继承2
c/c++ 继承与多态 容器与继承1说明了容器里使用继承关系的方法,这里再弄一个练习,巩固一下. 做一个类Basket,它有个multiset成员,key是智能指针std::shared_ptr< ...
- 中科曙光I620-G15服务器登录密码破解
服务器型号:中科曙光I620-G15服务器 系统:windowsserver2008R2 单位:保密 服务器登录密码忘记了,进不去桌面,后来在我们云修网工程师的指导下,顺利绕过密码登录系统,然后修改系 ...
- Oracle导入、导出数据库dmp文件
版本 1.实例数据完全导出 即导出指定实例下的所有数据 exp username/password@192.168.234.73/orcl file=d:/daochu/test.dmp full=y ...
- 周末班:Python基础之并发编程
进程 相关概念 进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本 ...
- 面向对象_del
老师的博客http://www.cnblogs.com/Eva-J/articles/7351812.html#_label7 内置的方法有很多不一定全都在object中 #python3中,所有类都 ...
- Thirft简单使用
安装Thrift 到thrift官网下载thrift.exe http://thrift.apache.org/download 将thrift-0.10.0.exe复制到C:\Program Fil ...
- Python开发【内置模块篇】configparser
生成配置文件 import configparser config = configparser.ConfigParser() config[', 'Compression': 'yes', ', ' ...
- MySQL之视图、触发器、事务、存储过程、函数
一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- B. Obtaining the String(模拟)
比较水的模拟 思路:就是模拟题意 注意:把数组开大点,开始wa了几次就是这个原因 #include<iostream> #include<string> #include< ...