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 ...
随机推荐
- 根据ID查询实体
//查询实体 $scope.findOne=function(id){ $http.get('../brand/findOne.do?id='+id).success( function(respon ...
- go构造函数
go构造函数 结构体没有构造函数,你可以创建一个函数返回一个相应类型的实例代替(类似一个工厂): func NewSaiyan(name string, power int) *Saiyan { re ...
- go变量和声明
go变量和声明 这将是美好的开始和结束,通过写下x = 4,我们查看变量,可以说声明了一个变量并赋值,但是很不幸,go语言变量声明和赋值比这更复杂.通过学习一些简单的示例开始学习变量声明和赋值.然后在 ...
- thinkphp wechat
该接口对应的文件为Com/Wechat.class.php, 主要用户接收微信推送过来的用户数据并自动回复. 注意:识别和分析用户发送的内容,并提供回复内容需要开发者更具实际情况自己实现,本接口值提供 ...
- Luogu P1738 洛谷的文件夹
P1738 Luogu 发一个链表题解! 仅有24ms,排名第一哦~ 圆圈代表点,每个店有两个指针,一个指向自己兄弟(同级文件夹),另一个指向自己孩子(子文件夹),还有一个保存当前名字. 有点像二叉树 ...
- P1537 弹珠
P1537 弹珠 题目描述 玛莎和比尔各自有自己的弹珠收藏.他们想重新分配收藏品,使两人能平等拥有弹珠.如果所有的弹珠的价值相同,那么他们就可以平分.但不幸的是,有一些弹珠更大,或者更美丽,所以,玛莎 ...
- ElasticSearch Roaring bitmap 和跳表联合查询
ElasticSearch Roaring map 先把所有数按65535划分, 划分方法就是求商和余数,商代表数字最终在哪一块,余数代表最终在块内的数字 比如 1, 65536, 65537, 13 ...
- install busybox时报error: storage size of ‘rlimit_fsize’ isn’t known struct rlimit rlimit_fsize
解决办法: 在busybox根目录下查找到文件:find -name libbb.h 在libbb.h.h中包含sys/resource.h 说明: 上述错误的原因是rlimit结构体未知,原因是相应 ...
- css布局方面小结
1 ####css选择器 1 .left-word.moreinfor{} 这样是找不到选择器的.中间需要一个空格 但是div.moreinfor 是可以的. 2 max-width的作用: p元素只 ...
- winform界面设计
http://www.cnblogs.com/wuhuacong/ 这位大师给了我指导方向 http://officeribbon.codeplex.com 提供了ribbon界面的控件 动态web ...