POJ 2449 Remmarguts' Date(第K短路 + A* + 最短路)题解
题意:找出第k短路,输出长度,没有输出-1
思路:这题可以用A*做。A*的原理是这样,我们用一个函数:f = g + h 来表示当前点的预期步数,f代表当前点的预期步数,g代表从起点走到当前的步数,h代表从当前点走到终点的最短路,显然h可以用最短路解出。那么我们从起点开始找,每次找f最小的点,直到找到第k个这样的点。
代码:
#include<queue> #include<cstring> #include<set> #include<map> #include<stack> #include<string> #include<cmath> #include<vector> #include<cstdio> #include<iostream> #include<algorithm> typedef long long ll; using namespace std; const int maxn = 1000 + 10; const int seed = 131; const ll MOD = 1e9 + 7; const int INF = 0x3f3f3f3f; int n, m, k, tot; struct Edge{int v, w, next; }edge[maxn * 100]; struct As{int f, g, pos;bool operator < (const As a) const{return a.f == f? a.g < g : a.f < f;} }; struct que{int u, v, w; }q[100005]; int head[maxn], dis[maxn]; bool vis[maxn]; void init(){memset(head, -1, sizeof(head));tot = 0; } void addEdge(int u, int v, int w){edge[tot].v = v;edge[tot].w = w;edge[tot].next = head[u];head[u] = tot++; } void spfa(int st){for(int i = 0; i <= n; i++) dis[i] = INF;memset(vis, false, sizeof(vis));vis[st] = true;dis[st] = 0;queue<int> q;while(!q.empty()) q.pop();q.push(st);while(!q.empty()){int u = q.front();q.pop();vis[u] = false;for(int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].v;int w = edge[i].w;if(dis[v] > dis[u] + w){dis[v] = dis[u] + w;if(!vis[v]){vis[v] = true;q.push(v);}}}} } int Astar(int st, int end){int cnt = 0;priority_queue<As> q;while(!q.empty()) q.pop();if(st == end) k++;if(dis[st] == INF) return -1;As a, b;a.pos = st, a.g = 0, a.f = a.g + dis[st];q.push(a);while(!q.empty()){a = q.top();q.pop();if(a.pos == end){cnt++;if(cnt == k) return a.f;}for(int i = head[a.pos]; i != -1; i = edge[i].next){b.pos = edge[i].v;b.g = a.g + edge[i].w;b.f = b.g + dis[b.pos];q.push(b);}}return -1; } int main(){while(~scanf("%d%d" ,&n, &m)){init();for(int i = 1; i <= m; i++){scanf("%d%d%d", &q[i].u, &q[i].v, &q[i].w);addEdge(q[i].v, q[i].u, q[i].w);}int s, t;scanf("%d%d%d", &s, &t, &k);spfa(t);init();for(int i = 1; i <= m; i++){addEdge(q[i].u, q[i].v, q[i].w);}printf("%d\n", Astar(s, t));}return 0; }
转载于:https://www.cnblogs.com/KirinSB/p/9630632.html
POJ 2449 Remmarguts' Date(第K短路 + A* + 最短路)题解相关推荐
- POJ 2449 Remmarguts' Date [第k短路]
Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536KB 64bit IO Format: %lld & %llu Descripti ...
- POJ - 2449 Remmarguts' Date(第k短路:spfa+A*)
题目链接:点击查看 题目大意:给出一个有向图,求第k短路 题目分析:偷学了一波A*,本来以为是多难的算法,其实就是bfs+优先队列的升级版,之前看的那些博客写的都太深奥了,以至于看了一半啥都没看懂然后 ...
- POJ 2449 Remmarguts' Date
POJ_2449 一开始我的思路就是把图上每个点搞一个容量不小于K的最大堆和最小堆,最小堆用于取当前该节点的第某短路值,最大堆用来保存前K小的最短路. 最后为了每次能查询全局最小值,再把N个点放到一个 ...
- POJ 2449 Remmarguts' Date(k短路模板)
link:https://vjudge.net/problem/POJ-2449 前面输入与大多最短路题相同 最后一行输入s,t,k 求从s到t的第K短路 wiki link: https://en. ...
- poj 2449 Remmarguts' Date 启发式搜索 A*算法
做这个题算是学了学spfa算法,一开始感觉spfa和dij好像:dij找最小点松弛,spfa就是一个一个的松弛,松到不能松. 求S到T的第K短路 思路:这个算法的思路是从源点S优雅的暴力跑bfs,用优 ...
- poj2449 Remmarguts' Date(第k短路问题)(A*+spfa/dijkstra)
思路来源 https://blog.csdn.net/berrykanry/article/details/78345894(通俗易懂解释好评) https://www.cnblogs.com/yyf ...
- 【POJ】【2449】Remmarguts' Date
K短路/A* 经(luo)典(ti) K短路题目= = K短路学习:http://www.cnblogs.com/Hilda/p/3226692.html 流程: 先把所有边逆向,做一遍dijkstr ...
- Poj2449 Remmarguts' Date 【A*搜索】K短路
http://poj.org/problem?id=2449 A*搜索求K短路. #include <cstdio> #include <cstring> #include & ...
- POJ 3255(迪杰斯特拉算法求次短路)
POJ3255,问题是求节点1到n的次短路. 在dijkstra求最短路算法的基础上进行变形,用两个数组分别记录源点到各节点最短路径和次短路径: 每次更新时,都将最短路的节点及可能成为次短路的节点pu ...
最新文章
- android炫酷的自定义view,Android自定义View实现炫酷进度条
- 诺基亚主导Windows Phone手机市场 前景仍然堪忧
- Nginx做前端代理时缓存与否的性能差别
- 如何创建可变数量的变量?
- java使用httpclient调用上传图片接口[示例]
- boost::hana::detail::any_of用法的测试程序
- MyBatis 源码解读-loadCustomLogImpl(settings)
- 扩展Snackbar 使其支持居中显示
- 从字节码看 finally关键字、异常表
- ios10中禁止Safari浏览器用户缩放页面
- TML 打印预览问题,怎么设置有些内容不出现在打印预览页面上。怎么控制,有下代码 看得不是很懂 求解释...
- Java连接MySQL数据库及简单操作代码
- 微信飞机大战小游戏制作分享(上集)含素材视频教程
- CCNA考试题库中英文翻译版及答案13
- JAVA扫码点餐(2)-项目过程
- 机器学习之One-Hot Encoding详解
- 如何获取多屏幕显示器工作区域
- gii无法访问 yii2_Gii的CURD生成无法访问?
- javascript关于累加和的发散思维
- Docker拉取Solace pubsub+镜像timeout的问题