POJ2449-A*算法-第k短路
(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦
题意:传送门
原题目描述在最下面。
给你一个有向图,求指定节点间的第k短路。
思路:
先反向跑出从终点开始的到每个节点的最短距离。
乐观估计函数\(f(n) = g(n) + h'(n)\)。\(g(n)\)表示到当前状态跑的距离,\(h'(n)\)表示到目标状态还需要的距离。
对于\(A*\)然后跑一遍\(bfs\)就可以了。
AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<assert.h>
#include<bitset>
#include<vector>
#include<queue>
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(x) (x)&(-(x))
#define all(x) (x).begin(),(x).end()
#define mk make_pair
#define pb push_back
#define fi first
#define se second
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int N = (int)1e3 +107;
int n, m, k, st, ed;
int dis[N],vis[N],time[N];
struct lp{
int f,g,v;
friend bool operator <(const lp &a,const lp &b){
if(a.f==b.f)return a.g>b.g;
return a.f>b.f;
}
}aa,bb;
struct lh{
int v,w,nex;
}cw[100000+5],rev[100000+5];
int head[N],tot,headd[N],tum;
int q[2500005];
void add(int u,int v,int w){
cw[++tot].v=v;cw[tot].nex=head[u];cw[tot].w=w;
head[u]=tot;
rev[++tum].v=u;rev[tum].nex=headd[v];rev[tum].w=w;
headd[v]=tum;
}
void spfa(){
for(int i = 1; i <= n; i++) dis[i] = INF;
memset(vis, 0, sizeof(vis));
int h = 0, t = 1;
q[0] = ed;
dis[ed] = 0;
while(h < t){
int u = q[h++];
vis[u] = 0;
for(int i = headd[u] ; ~i ; i = rev[i].nex){
int v = rev[i].v, w = rev[i].w;
if(dis[v] > dis[u] + w){
dis[v] = dis[u] + w;
if(!vis[v]){
q[t++] = v;
vis[v] = 1;
}
}
}
}
}
int Astar(){
if(dis[st]==INF)return -1;
memset(time,0,sizeof(time));
aa.v=st;aa.f=dis[st];aa.g=0;
priority_queue<lp>Q;
Q.push(aa);
while(!Q.empty()){
bb = Q.top();Q.pop();
int u = bb.v;
time[u]++;
if(time[u]==k&&u==ed)return bb.g;
if(time[u]>k)continue;
for(int i=head[u];~i;i=cw[i].nex){
int v = cw[i].v;
aa.v = v;
aa.g=bb.g+cw[i].w;
aa.f=aa.g+dis[v];
Q.push(aa);
}
}
return -1;
}
int main(){
while(~scanf("%d%d", &n, &m)){
tot=tum=-1;
memset(head,-1,sizeof(head));
memset(headd,-1,sizeof(headd));
for(int i = 0, u, v, w; i < m; ++i){
scanf("%d%d%d", &u, &v, &w);
add(u,v,w);
}
scanf("%d%d%d", &st, &ed, &k);
spfa();
if(st == ed)k++;
printf("%d\n", Astar());
}
return 0;
}
####原题目描述:
POJ2449-A*算法-第k短路的更多相关文章
- POJ2449 Remmarguts' Date 第K短路
POJ2449 比较裸的K短路问题 K短路听起来高大上 实际思路并不复杂 首先对终点t到其他所有点求最短路 即为dist[] 然后由起点s 根据当前走过的距离+dist[]进行A*搜索 第k次到达t即 ...
- A*算法——第K短路
例题 JZOJ senior 1163第K短路 题目描述 Bessie 来到一个小农场,有时她想回老家看看她的一位好友.她不想太早地回到老家,因为她喜欢途中的美丽风景.她决定选择K短路径,而不是最短路 ...
- bellman-ford算法求K短路O(n*m),以及判负环O(n*m)
#include<iostream> #include<algorithm> #include<cstring> using namespace std; cons ...
- 图论(A*算法,K短路) :POJ 2449 Remmarguts' Date
Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 25216 Accepted: 6882 ...
- A*算法求K短路模板 POJ 2449
#include<cstdio> #include<queue> #include<cstring> using namespace std; const int ...
- k短路模板 POJ2449
采用A*算法的k短路模板 #include <iostream> #include <cstdio> #include <cstring> #include < ...
- k短路算法
k短路算法 求解k短路用到了A* 算法,A* ( A star )算法,又称启发式搜索算法,与之相对的,dfs与bfs都成为盲目型搜索:即为带有估价函数的优先队列BFS称为A*算法. 该算法的核心思想 ...
- bzoj 1975 [Sdoi2010]魔法猪学院(k短路)
题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...
- [poj2449]Remmarguts' Date(K短路模板题,A*算法)
解题关键:k短路模板题,A*算法解决. #include<cstdio> #include<cstring> #include<algorithm> #includ ...
随机推荐
- Windows win32 API 类库 硬件
// 硬件 Win32_Processor, // CPU 处理器 Win32_PhysicalMemory, // 物理内存条 Win32_Keyboard, // 键盘 Win32_Pointin ...
- java基础方法笔记
Java环境 1.编译 javac HelloWorld.java 2.运行 java HelloWorld 3.执行class文件 java -classpath C:\java\myclasses ...
- SQL 按关键字排序
SQL ORDER BY Keyword(按关键字排序) ORDER BY 关键字用于对结果集进行排序. SQL ORDER BY 关键字 ORDER BY 关键字用于按升序或降序对结果集进行排序. ...
- pandas for python
http://pandas.pydata.org/pandas-docs/stable/user_guide/index.html 不算太难,需要拿一本线性代数看看矩阵原理即可.重点在于考虑如何运用, ...
- VC内联汇编,引用程序中的变量
int a=5; //变量a _asm { mov eax,a; //将变量a的值放入寄存器eax add eax,eax; //相当于a=a+a mov a,eax; // ...
- Ubuntu下qemu环境搭建vexpress开发平台
在查找资料过程中,发现自己搭建虚拟的arm环境的话,有一个比较好的软件就是qemu了,当然还有其他的,大家各投所好就好. 接下来说一下qemu环境搭建过程. 其实搭建很简单,作为小白,我还是捣鼓了两三 ...
- ebay上传图片的要求
eBay's Picture Requirements Introduction to Pictures in Listings Pictures make an item more appealin ...
- JAVA调用R脚本 windwos路径下
RConnection c = new RConnection();// REXP x = c.eval("source('D:\\\\jiaoben\\\\RJava_test.R',en ...
- 【Javescript】DOM(文档对象模型)
1.定义: DOM是Document Object Model文档对象模型的缩写.是针对HTML和XML文档的一个API,通过DOM可以去改变文档. 例如:我们有一段HTML,那么如何访问第二层第一个 ...
- 20140814 explicit
1.explicit explicit 只对构造函数起作用,用来抑制隐式转换. 如: class A { A(int a); }; int Functi ...