题意:找出第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* + 最短路)题解相关推荐

  1. POJ 2449 Remmarguts' Date [第k短路]

    Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536KB 64bit IO Format: %lld & %llu Descripti ...

  2. POJ - 2449 Remmarguts' Date(第k短路:spfa+A*)

    题目链接:点击查看 题目大意:给出一个有向图,求第k短路 题目分析:偷学了一波A*,本来以为是多难的算法,其实就是bfs+优先队列的升级版,之前看的那些博客写的都太深奥了,以至于看了一半啥都没看懂然后 ...

  3. POJ 2449 Remmarguts' Date

    POJ_2449 一开始我的思路就是把图上每个点搞一个容量不小于K的最大堆和最小堆,最小堆用于取当前该节点的第某短路值,最大堆用来保存前K小的最短路. 最后为了每次能查询全局最小值,再把N个点放到一个 ...

  4. POJ 2449 Remmarguts' Date(k短路模板)

    link:https://vjudge.net/problem/POJ-2449 前面输入与大多最短路题相同 最后一行输入s,t,k 求从s到t的第K短路 wiki link: https://en. ...

  5. poj 2449 Remmarguts' Date 启发式搜索 A*算法

    做这个题算是学了学spfa算法,一开始感觉spfa和dij好像:dij找最小点松弛,spfa就是一个一个的松弛,松到不能松. 求S到T的第K短路 思路:这个算法的思路是从源点S优雅的暴力跑bfs,用优 ...

  6. poj2449 Remmarguts' Date(第k短路问题)(A*+spfa/dijkstra)

    思路来源 https://blog.csdn.net/berrykanry/article/details/78345894(通俗易懂解释好评) https://www.cnblogs.com/yyf ...

  7. 【POJ】【2449】Remmarguts' Date

    K短路/A* 经(luo)典(ti) K短路题目= = K短路学习:http://www.cnblogs.com/Hilda/p/3226692.html 流程: 先把所有边逆向,做一遍dijkstr ...

  8. Poj2449 Remmarguts' Date 【A*搜索】K短路

    http://poj.org/problem?id=2449 A*搜索求K短路. #include <cstdio> #include <cstring> #include & ...

  9. POJ 3255(迪杰斯特拉算法求次短路)

    POJ3255,问题是求节点1到n的次短路. 在dijkstra求最短路算法的基础上进行变形,用两个数组分别记录源点到各节点最短路径和次短路径: 每次更新时,都将最短路的节点及可能成为次短路的节点pu ...

最新文章

  1. android炫酷的自定义view,Android自定义View实现炫酷进度条
  2. 诺基亚主导Windows Phone手机市场 前景仍然堪忧
  3. Nginx做前端代理时缓存与否的性能差别
  4. 如何创建可变数量的变量?
  5. java使用httpclient调用上传图片接口[示例]
  6. boost::hana::detail::any_of用法的测试程序
  7. MyBatis 源码解读-loadCustomLogImpl(settings)
  8. 扩展Snackbar 使其支持居中显示
  9. 从字节码看 finally关键字、异常表
  10. ios10中禁止Safari浏览器用户缩放页面
  11. TML 打印预览问题,怎么设置有些内容不出现在打印预览页面上。怎么控制,有下代码 看得不是很懂 求解释...
  12. Java连接MySQL数据库及简单操作代码
  13. 微信飞机大战小游戏制作分享(上集)含素材视频教程
  14. CCNA考试题库中英文翻译版及答案13
  15. JAVA扫码点餐(2)-项目过程
  16. 机器学习之One-Hot Encoding详解
  17. 如何获取多屏幕显示器工作区域
  18. gii无法访问 yii2_Gii的CURD生成无法访问?
  19. javascript关于累加和的发散思维
  20. Docker拉取Solace pubsub+镜像timeout的问题

热门文章

  1. 字节跳动教育大规模裁员:赔付方式N+2
  2. 全球通信云市场爆发增长,RTC 技术普惠还有多远
  3. 这才是程序员的爱情观!?
  4. 粽子也内卷?2021 互联网大厂端午礼盒大盘点
  5. 用Cocos Studio 2.3.2制作UI界面中控件不再支持运行3d动作特效
  6. 从科幻灵感开始的一场数据存储基础设施实验之旅
  7. log4j2的xml的配置样例
  8. 在ArcEngine下实现图层属性过滤的两种方法
  9. CrowdStrike加入VirusTotal阵营
  10. 第六阶段 小学期(一)——电子商务