做这个题算是学了学spfa算法,一开始感觉spfa和dij好像;dij找最小点松弛,spfa就是一个一个的松弛,松到不能松。

求S到T的第K短路

思路:这个算法的思路是从源点S优雅的暴力跑bfs,用优先队列来装跑的过程中点的位置以及跑的距离,优先队列按照来装跑的距离最短的排序,然后随着跑跑的距离就越来越长,那总会跑到T点吧,这个时候你的cnt+1,直到第k次跑到T点的时候就是第K短路了。看着很迷,但是为什么说是优雅呢,就是该算法的核心,A*就是Astar算法

1.首先,从终点T跑一边Spfa,用数组d[ ]记录每一个点到终点T的最短距离。

2.然后,从起点S跑bfs,边跑边记录跑的距离F与位置now,优雅的就是,当我们每次跑到一个位置的时候,其实从位置now到T点的最短的距离G又确定了,G=F+d[now],然后我们结构体装进去位置,已经跑的距离,从该点跑到T点的最短距离{now,F,G},并且按照G点排序,当我们走到终点now=T,这个时候就是第一次跑到G点的时候,那么F就是第一短的距离,那么跑到第k次终点T,此时的F就是第K短路。

参考博客:https://blog.csdn.net/z_mendez/article/details/47057461  超级清晰的介绍

代码如下:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<set>
#include<stack>
#include<vector>
#include<map>
#include<queue>
#define myself i,l,r
#define lson i<<1
#define rson i<<1|1
#define Lson i<<1,l,mid
#define Rson i<<1|1,mid+1,r
#define half (l+r)/2
#define inff 0x3f3f3f3f
#define lowbit(x) x&(-x)
#define me(a,b) memset(a,b,sizeof(a))
#define min4(a,b,c,d) min(min(a,b),min(c,d))
#define min3(x,y,z) min(min(x,y),min(y,z))
#define max4(a,b,c,d) max(max(a,b),max(c,d))
#define max3(x,y,z) max(max(x,y),max(y,z))
typedef long long ll;
const double eqs=1e-9;
const double pi=acos(-1.0);
const double E=2.718281828459;
using namespace std;
const int maxm=1e5+5;
const int maxn=1005;
int d[maxn],head[maxn],rhead[maxn];
int vis[maxn],n,m,t,k;
struct Edge
{int to,p,val;
}edge[maxm<<1],redge[maxm<<1];
struct node
{int now,g,f;bool friend operator<(node s,node e){if(s.f==e.f) return s.g>e.g;return s.f>e.f;}
};
void init()
{for(int i=0;i<=n;i++){d[i]=inff;head[i]=rhead[i]=-1;vis[i]=0;}
}
void add(int u,int v,int val,int sign)
{redge[sign]=Edge{u,rhead[v],val};rhead[v]=sign;edge[sign]=Edge{v,head[u],val};head[u]=sign;
}
void Spfa(int u)
{queue<int> q;d[u]=0;q.push(u);while(!q.empty()){u=q.front();q.pop();vis[u]=0;for(int i=rhead[u];~i;i=redge[i].p){int v=redge[i].to;if(d[v]>d[u]+redge[i].val){d[v]=d[u]+redge[i].val;if(!vis[v]){q.push(v);vis[v]=1;}}}}
}
int Astar(int s)
{priority_queue<node>q;int cnt=0;if(s==t) k++;///如果是起点等于终点k++if(d[s]==inff) return -1;node a,next;a=node{s,0,d[s]};q.push(a);while(!q.empty()){a=q.top();q.pop();if(a.now==t){cnt++;if(cnt==k)return a.g;}for(int i=head[a.now];i!=-1;i=edge[i].p){next.now=edge[i].to;next.g=a.g+edge[i].val;next.f=next.g+d[next.now];q.push(next);}}return -1;
}
int main()
{int s,x,y,z;while(scanf("%d%d",&n,&m)!=EOF){init();for(int i=0;i<m;i++){scanf("%d%d%d",&x,&y,&z);add(x,y,z,i);}scanf("%d%d%d",&s,&t,&k);Spfa(t);printf("%d\n",Astar(s));}return 0;
}

poj 2449 Remmarguts' Date 启发式搜索 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短路模板)

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

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

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

  4. POJ 2449 Remmarguts' Date

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

  5. POJ 2449 Remmarguts' Date(第K短路 + A* + 最短路)题解

    题意:找出第k短路,输出长度,没有输出-1 思路:这题可以用A*做.A*的原理是这样,我们用一个函数:f = g + h 来表示当前点的预期步数,f代表当前点的预期步数,g代表从起点走到当前的步数,h ...

  6. 【POJ】【2449】Remmarguts' Date

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

  7. 启发式搜索: A*算法

    启发式搜索: A*算法 回顾: 优先队列BFS.最短路 A*算法 – 估价函数 为什么? A*算法 实战 回顾: 优先队列BFS.最短路 普通BFS:按层扩展 优先队列BFS:每次从队列中取出当前代价 ...

  8. Remmarguts' Date(POJ2449+最短路+A*算法)

    题目链接:http://poj.org/problem?id=2449 题目: 题意:求有向图两点间的k短路. 思路:最短路+A*算法 代码实现如下: 1 #include <set> 2 ...

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

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

最新文章

  1. 送Datawhale限量红包封面啦!
  2. Adobe Premiere Pro CC 2015.0 已停止工作【解决方案】
  3. Python Django 通过admin后台创建表数据
  4. 连续对焦 auto对焦_如何在Windows 10上使用对焦辅助(请勿打扰模式)
  5. 为什么应始终将连接池与Oracle XE一起使用
  6. RefFieldMethodDetails——查看类的域和方法
  7. ubuntu 2018 apt 代理proxy设置
  8. UI自动化学习过程get的知识点
  9. 基于springboot+vue的智慧教室预约系统(前后端分离)
  10. Windows Bat脚本实现定时重启应用程序
  11. 销售管理系统哪个好用?
  12. exceljs如何画单元格斜线?
  13. 【2017.11.16】外包单报价
  14. Win10 设置系统还原点
  15. element-ui 下载后本地使用
  16. 【自用】R语言处理GEO转录组数据记录
  17. Day7-Python综合作业1(DataWhale)
  18. 手动删除eureka多余服务
  19. kill进程的几种方法
  20. MATLAB编写黄金分割法

热门文章

  1. Cause:compileSdkVersion is not specified
  2. string判断是否是正常的ip格式
  3. 「日常训练」Bad Luck Island(Codeforces Round 301 Div.2 D)
  4. 2022-2028年中国液体燃料行业市场研究及前瞻分析报告
  5. Jenkins 2.16.3默认没有Launch agent via Java Web Start,如何配置使用
  6. 软件工程需求设计说明书
  7. 新生选课系统使用指南
  8. ccf Z字形扫描
  9. 网关 0.0.0.0_久违的升级——全新米家智能多模网关
  10. oracle 开始一个事务,oracle的启动与关闭原理-事务commit或者rollback