POJ 2449 A* 求 k 短路 模板题
来源:互联网 发布:如何注册淘宝海外买手 编辑:程序博客网 时间:2024/06/03 19:41
题意:n个点,m条边的有向图,求s到t的第k短路。
输入:n,m,m条边(u,v,w),s,t,k。【多组输入】
A*算法求第k短路模板题。也是自己第一次写A*
写完这个后,进一步理解了Dijkstra的搜索本质,只不过经常我们使用Dijkstra算法的时候是为了求源点到所有点的最短路,称不上搜索。A*也可以说是有目的地的Dijkstra。
自己理解的A*,像是Dijkstra + 估价函数。A*去掉h那一部分,就是Dijkstra了,而又因为我们经常用Dijkstra求的仅仅是最短路,所以cnt数组变成了bool型的vis数组。估价函数的作用在于减小空间、缩短时间,对于结果的正确性是没有影响的。
这道题需要小注意的是当s==t时,最短路变成了0,而这条路按题意来说是不计算在k以内,也就是说s==t时,k++。
用A*求k短路时,估价函数h()是当前点到终点的最短路,用spfa预处理即可。当一个点第k次出队时,就是起点到这个点的第k短路。
#include <cstdio>#include <algorithm>#include <cstring>#include <queue>using namespace std;int n, m, s, t, k, d[1005], cnt[1005];int h[1005], h2[1005], nx[100005], nx2[100005], w[100005], fr[100005], to[100005];bool vis[1005];struct node{ int id, g, h; // f = h + g bool operator < (node tmp) const { return h+g > tmp.h + tmp.g; }};node make_node(int id, int g, int h){ node res; res.id = id, res.h = h, res.g = g; return res;}priority_queue <node> q;queue <int> q2;void spfa(){ memset(d, 0x3f, sizeof d); memset(vis, 0, sizeof vis); d[t] = 0; q2.push(t); while(!q2.empty()) { int u = q2.front(); q2.pop(); vis[u] = 0; for(int i = h2[u]; i; i = nx2[i]) { int v = fr[i]; if(d[u] + w[i] < d[v]) { d[v] = d[u] + w[i]; if(!vis[v]) { vis[v] = 1; q2.push(v);} } } }}int Astar(){ memset(cnt, 0, sizeof cnt); while(!q.empty()) q.pop(); q.push(make_node(s, 0, d[s])); while(!q.empty()) { node u = q.top(); q.pop(); cnt[u.id]++; if(cnt[t] == k) return u.g; if(cnt[u.id] > k) continue; for(int i = h[u.id]; i; i = nx[i]) { int v = to[i]; q.push(make_node(v, u.g+w[i], d[v])); } } return -1;}int main(){ while(~scanf("%d %d", &n, &m)) { memset( h, 0, sizeof h); memset( h2, 0, sizeof h2); for(int i = 1; i <= m; i++) { int u, v; scanf("%d %d %d", &u, &v, w+i); nx[i] = h[u]; h[u] = i; nx2[i] = h2[v]; h2[v] = i; fr[i] = u; to[i] = v; } scanf("%d %d %d", &s, &t, &k); k += s==t; spfa(); printf("%d\n", Astar()); } return 0;}
0 0
- POJ 2449 A* 求 k 短路 模板题
- poj 2449 A* +Dijkstra求第K短路(模板题)
- poj 2449(A*求第K短路)
- POJ 2449Remmarguts' Date (A* 求K短路)
- poj 2449 Remmarguts' Date(A*求第K短路)
- poj-2449-Remmarguts' Date-A*+求K短路
- poj 2449 (A* + Dijsktra 求K短路)
- poj 2449 Remmarguts' Date A*+spfa求第k短路
- POJ 2449 Remmarguts' Date (A*搜索求K短路)
- POJ 2449 Remmarguts' Date 求k短路 A*+dijkstra
- 【POJ 2449】Remmarguts' Date(A*+dij求k短路)
- POJ 2449 Remmarguts' Date (求第K短路,A* + Dijkstra)
- 【模板】POJ 2449 K短路(A*+dijkstra)
- <A*算法模板>poj 2449 第k短路
- (poj 2449 Remmarguts' Date)<A*-K短路模板>
- poj 2449 k短路模板
- poj 2449 k短路--模板
- POJ 2447 Remmarguts' Date【k短路 SPFA+A* 模板题】
- 常用opencv函数
- 使用Apache Benchmark做压力测试遇上的5个常见问题
- 卷积神经网络CNN
- Linux 多线程环境下 进程线程终止函数小结
- [刷题]Inorder Successor in BST
- POJ 2449 A* 求 k 短路 模板题
- 【解决】Spark On Yarn执行中executor内存限制问题
- dos2unix批量转换的一种方法
- 关于comparator以及comparable的区别及应用
- Linux SendMail总结
- 巧用Ajax的beforeSend 提高用户体验
- ES003-CURL使用
- 黑马程序员——2.1.基础语法(关键字、常量、进制、变量、类型转换、运算符、流程控制(判断、选择、循环))
- 解决微信中支付宝无法使用的问题