第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(所以就愉快地特判了),首先 ...
随机推荐
- [LeetCode] 8. String to Integer (atoi) ☆
Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...
- mysql 并发测试
针对上一节做一些针对公司业务的测试. 我们来做一些压力测试. 服务器配置: 操作系统: centos 5.6-64 CPU: 8核 内存: 8G 硬盘:sas 文件系统:linux MySQL:5.6 ...
- 省队集训 Day3 吴清华
[题目大意] 给网格图,共有$n * n$个关键节点,横向.纵向距离均为$d$,那么网格总长度和宽度均为$(n+1) * d + 1$,最外围一圈除了四角是终止节点.要求每个关键节点都要通过线连向终止 ...
- poj 2000 Gold Coins
题目链接:http://poj.org/problem?id=2000 题目大意:求N天得到多少个金币,第一天得到1个,第二.三天得到2个,第四.五.六天得到3个....以此类推,得到第N天的金币数. ...
- SpringBoot工程目录配置
Spring Boot建议的目录结果如下: root package结构:com.example.myproject com +- example +- myproject +- Applicat ...
- python基础===self的理解
self是类的实例 self有点类似java中的this,无实际意义.但是约定俗成的都是用self表示类的实例 class A: def func(self): print(self) #指向的是类的 ...
- MACACA===gradle下载和安装
gradle下载地址: http://services.gradle.org/distributions/ 或者直接点击这个: http://services.gradle.org/distribut ...
- c#上传文件时,当选择的文件为0kb,会验证不通过
FileUpload1.HasFile 当FileUpload1控件选择的文件为0KB时,FileUpload1.HasFile返回false
- 动画基础--基于Core Animation(1)
1.简介 上一篇文章[New learn]动画-基于UIView了解到了一些直接由UIView这个在UIKIT提供的类中提供的一些动画方法. 使用UIView的动画特性已经能够满足我们很多的需求,它是 ...
- Microsoft .NET Native
首页: https://msdn.microsoft.com/en-US/vstudio/dotnetnative