第K短路模板【POJ2449 / 洛谷2483 / BZOJ1975 / HDU6181】
1.到底如何求k短路的?
我们考虑,要求k短路,要先求出最短路/次短路/第三短路……/第(k-1)短路,然后访问到第k短路。
接下来的方法就是如此操作的。
2.f(x)的意义?
我们得到的f(x)更小,优先访问这个f(x)的点。
我们可以定义一组数{p,g,h},p是某一个点,g是估价,h是实际,那么g+h更小的点p会优先访问。
为什么呢?因为假设我们求出了w短路,接下来要求(w+1)短路,就要求最小的另一条路径。
应该易理解。
3.为什么选择最短路来估价?
很简单的选择,我们既然要求最短了,当然是找最短路。
事实上这不是我们的初衷,但是有了“先求(k-1)短路”的概念后,这么理解也可以了。
4.实现
实现是比较简单的。
如何预处理出g(x)呢?显然,将所有边反向,然后求end到所有点的单源最短路径就好了。
接下来的启发式搜索可以简单解决。
事实上,就是在暴力搜索的基础上增加了启发式搜索:往一个最优的点的地方走。
另外还是要专来一篇这题blog的QAQ
关于上题目的程序:
86ms
#include<iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;
const int N=+;
const int inf=0x3f3f3f3f;
struct edge
{
int u,v,w,next;
}e[N<<];
int head[N<<],head1[N<<],dis[N<<],vis[N<<],cnt[N<<];
int num;
int n,m;
int s,t,k;
struct node
{
int g,h;
int to;
bool operator<(node a)const
{
return a.h+a.g<h+g;
}
};
void init()
{
num=;
memset(head1,-,sizeof(head1));
memset(head,-,sizeof(head));
}
void addegde(int u,int v,int w)
{
e[num].v=v;
e[num].w=w;
e[num].next=head[u];
head[u]=num++;
e[num].v=u;
e[num].w=w;
e[num].next=head1[v];
head1[v]=num++;
}
void spfa()
{
memset(vis,,sizeof(vis));
memset(dis,inf,sizeof(dis));
dis[t]=;
vis[t]=;
queue<int>q;
q.push(t);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=;
for(int i=head1[u];i!=-;i=e[i].next)
{
int v=e[i].v;
if(dis[v]>dis[u]+e[i].w)
{
dis[v]=dis[u]+e[i].w;
if(!vis[v])
{
q.push(v);
vis[v]=;
}
}
}
}
}
int AA()
{
memset(cnt,,sizeof(cnt));
priority_queue<node>Q;
node p,q;
p.g=;
p.to=s;
p.h=dis[s];
Q.push(p);
while(!Q.empty())
{
q=Q.top();
Q.pop();
cnt[q.to]++;
if(cnt[q.to]>k)
continue;
if(cnt[t]==k)
return q.g;
for(int i=head[q.to];i!=-;i=e[i].next)
{
int v=e[i].v;
p.to=v;
p.g=q.g+e[i].w;
p.h=dis[v];
Q.push(p);
}
}
return -;
}
int main()
{
while(~scanf("%d%d%d",&n,&m,&k))
{
scanf("%d%d",&s,&t);
init();
for(int i=;i<m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addegde(u,v,w);
} spfa();
if(s==t)k++;
//cout<<dis[s]<<endl;
int ans=AA();
printf("%d\n",ans);
}
return ;
}
SPFA+A*
第K短路模板【POJ2449 / 洛谷2483 / BZOJ1975 / HDU6181】的更多相关文章
- k短路模板(洛谷P2483 [SDOI2010]魔法猪学院)(k短路,最短路,左偏树,priority_queue)
你谷数据够强了,以前的A*应该差不多死掉了. 所以,小伙伴们快来一起把YL顶上去把!戳这里! 俞鼎力的课件 需要掌握的内容: Dijkstra构建最短路径树. 可持久化堆(使用左偏树,因其有二叉树结构 ...
- k短路模板 POJ2449
采用A*算法的k短路模板 #include <iostream> #include <cstdio> #include <cstring> #include < ...
- [poj2449]Remmarguts' Date(K短路模板题,A*算法)
解题关键:k短路模板题,A*算法解决. #include<cstdio> #include<cstring> #include<algorithm> #includ ...
- 点分治模板(洛谷P4178 Tree)(树分治,树的重心,容斥原理)
推荐YCB的总结 推荐你谷ysn等巨佬的详细题解 大致流程-- dfs求出当前树的重心 对当前树内经过重心的路径统计答案(一条路径由两条由重心到其它点的子路径合并而成) 容斥减去不合法情况(两条子路径 ...
- POJ 2449Remmarguts' Date K短路模板 SPFA+A*
K短路模板,A*+SPFA求K短路.A*中h的求法为在反图中做SPFA,求出到T点的最短路,极为估价函数h(这里不再是估价,而是准确值),然后跑A*,从S点开始(此时为最短路),然后把与S点能达到的点 ...
- ACM-ICPC 2018 沈阳赛区网络预赛 D. Made In Heaven(第k短路模板)
求第k短路模板 先逆向求每个点到终点的距离,再用dij算法,不会超时(虽然还没搞明白为啥... #include<iostream> #include<cstdio> #inc ...
- poj 2499第K短路模板
第k*短路模板(单项边) #include <iostream> #include <cstdio> #include <algorithm> #include & ...
- K短路模板POJ 2449 Remmarguts' Date
Time Limit: 4000MS Memory Limit: 65536K Total Submissions:32863 Accepted: 8953 Description &qu ...
- 洛谷2483 k短路([SDOI2010]魔法猪学院)
题目请戳这里 一句话题意: 给你一张n个节点,m条单向边的图,求1到n第k短的路. emmm,纪念第一个黑题(我是真的菜啊!!) 这题目还是很难的,本蒟蒻只会被洛谷卡掉的A(所以就愉快地特判了),首先 ...
随机推荐
- 【C++对象模型】第五章 构造、解构、拷贝 语意学
1.构造语义学 C++的构造函数可能内带大量的隐藏码,因为编译器会扩充每一个构造函数,扩充程度视 class 的继承体系而定.一般而言编译器所做的扩充操作大约如下: 所有虚基类成员构造函数必须被调用, ...
- [Luogu 2146] NOI2015 软件包管理器
[Luogu 2146] NOI2015 软件包管理器 树剖好题. 通过对题目的分析发现,这些软件构成一棵树,\(0\) 是树根. 每下载一个软件,需要下载根到这个软件的路径上的所有软件: 每卸载一个 ...
- PHP日期时间操作
一.设置时区 date_default_timezone_set('PRC'); 二.获取当前时间的 Unix 时间戳(格林威治时间 1970 年 1 月 1 日 00:00:00到当前时间的秒数)和 ...
- Item 9 覆盖equals时总要覆盖hashCode
为什么覆盖equals时,总要覆盖hashCode? 原因是,根据Object规范: 如果两个对象根据equals(Object)方法比较是相等的,那么调用这两个对象中任意一个对象的hashCod ...
- bzoj 3126: [Usaco2013 Open]Photo——单调队列优化dp
Description 给你一个n长度的数轴和m个区间,每个区间里有且仅有一个点,问能有多少个点 Input * Line 1: Two integers N and M. * Lines 2..M+ ...
- 【SPOJ】2319 BIGSEQ - Sequence
[算法]数位DP [题解]动态规划 题目要求的是大整数……没办法只写了小数字的,感觉应该没错. 大题框架是最大值最小化的二分问题. 对于每一块要求count(b)-count(a-1)≥s 已知a如何 ...
- Java多线程学习(二)synchronized关键字(2)
转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79670775 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...
- DIV+CSS综合实例【传智PHP首页】
1.首页结构 2.准备工作 所有素材放到与当前网页同级的目录下: 网页背景色.背景图: 主页宽度:1000px: 创建CSS文件,将CSS文件引入到当前的HTML文件中. 3.实现 效果图: HTML ...
- python基础===将json转换为dict的办法
首先json是字符串. 大家都知道,字符串是用来传递信息的.json字符串实际上就是一种规定了格式的字符串, 通过这种格式,我们可以在不同的编程语言之间互相传递信息,比如我们可以把javascript ...
- selenium===介绍
selenium 是支持java.python.ruby.php.C#.JavaScript . 从语言易学性来讲,首选ruby ,python 从语言应用广度来讲,首选java.C#.php. 从语 ...