A*算法:
A*,启发式搜索,是一种较为有效的搜索方法。
我们在搜索的时候,很多时候在当前状态,已经不是最优解了,但是我们却继续求解;这个就是暴力搜索浪费时间的原因。
我们在有些时候,往往可以根据一些信息推断出继续搜索是一种劣解。
所以如果能够判断出来的话,就可以不继续了,以达到节省运行时间的目的。
估价函数:
为了提高搜索效率,我们可以对未来可能产生的代价进行预估。我们设计一个估价函数,以任意状态输入,计算出从该状态到目标状态所需代价的估计值。
在搜索时,我们总沿着当前代价+未来估价最小的状态进行搜索。估价函数需要满足:设当前状态state到目标函数所需代价的估计值为f(state)设在未来的搜索中,实际求出的从当前状态state到目标状态的最小代价为g(state)对于任意的state,应该有f(state)<=g(state)
也就是说,估价函数的估值不能大于未来实际代价,估价比实际代价更优。第K短路:
根据估价函数的设计准则,在第K短路中从x到T的估计距离f(x)应该不大于第K短路中从x到T的实际距离g(x),于是,我们可以把估价函数f(x)定为从x到T的最短路径长度,这样不但能保证f(x)<=g(x),还能顺应g(x)的实际变化趋势。
实现过程:
1.预处理f(x),在反向图上以T为起点求到每个点的最短路
2.定义堆,维护{p,g,h},p是某一个点,g是估价,h是实际,那么g+h更小的点p会优先访问
3.取出堆顶元素u扩展,如果节点v被取出的次数尚未达到k,就把新的{v,g,h+length(u,v)}插入堆中
4.重复第2-3步,直到第K次取出终点T,此时走过的路径长度就是第K短路因为估价函数的作用,图中很多节点访问次数远小于K

我们定义一个评估值f(x)=g(x)+h(x)(例如求k短路中g(x)表示已经走了多远,h(x)表示从这个点到终点的最短路)f(x)越小就意味着越好咯,我们每次都去寻找最小的f(x)来进行操作,那不就很妙了

那k短路怎么求呢 
我们就先求出每个点到终点的最短路——把图反过来..从t做最短路【捂脸】 这样就求出来了h(x) 
然后就..每次做一个点,然后…求一个f(x),扔进优先队列里.. 
最后t出现k次也就可以了

模板:

#include<bits/stdc++.h>
using namespace std;#define ee exp(1)
#define pi acos(-1)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define ll long long
#define ull unsigned long long
#define mem(a,b) memset(a,b,sizeof(a))
int gcd(int a,int b){return b?gcd(b,a%b):a;}const int maxn=1e6+5;
int n,m,s,t,k,r,cnt,p1,p2,head1[maxn],head2[maxn],vis[maxn];
ll d[maxn];
struct node{int to,w,next;
}e1[maxn],e2[maxn];
struct qnode{int v;ll w;qnode(int v,ll w):v(v),w(w) {}friend bool operator < (qnode x,qnode y){return x.w+d[x.v]>y.w+d[y.v];}
};
void add1(int u,int v,int w)
{e1[++p1].to=v;e1[p1].w=w;e1[p1].next=head1[u];head1[u]=p1;
}
void add2(int u,int v,int w)
{e2[++p2].to=v;e2[p2].w=w;e2[p2].next=head2[u];head2[u]=p2;
}
void spfa()//反向图,t到其他点的距离
{queue<int> q;q.push(t);for(int i=1; i<=n; i++)d[i]=inf;mem(vis,0);d[t]=0;vis[t]=1;while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=head1[u]; i; i=e1[i].next){int v=e1[i].to;int w=e1[i].w;if(d[v]>d[u]+w){d[v]=d[u]+w;if(!vis[v]){vis[v]=1;q.push(v);}}}}
}ll astar()//A*算法
{if(d[s]==inf)return -1;priority_queue<qnode> pe;pe.push(qnode(s,0));cnt=0;while(!pe.empty()){qnode u=pe.top();pe.pop();if(u.v==t){cnt++;if(cnt==k)return u.w;}for(int i=head2[u.v]; i; i=e2[i].next){int v=e2[i].to;pe.push(qnode(v,u.w+e2[i].w));}}return -1;
}int main()
{while(~scanf("%d%d",&n,&m)){mem(head1,0);p1=0;mem(head2,0);p2=0;scanf("%d%d%d%d",&s,&t,&k,&r);while(m--){int u,v,w;scanf("%d%d%d",&u,&v,&w);add1(v,u,w);//反向图 add2(u,v,w);}spfa();ll ans=astar();if(ans==-1||ans>r)puts("Whitesnake!");else puts("yareyaredawa");}return 0;
}

第k短路 (A*算法)相关推荐

  1. 第K短路(A*算法)

    给定一张 NN 个点(编号 1,2-N),MM 条边的有向图,求从起点 S 到终点 T 的第 K 短路的长度,路径允许重复经过点或边. 注意: 每条最短路中至少要包含一条边. 输入格式 第一行包含两个 ...

  2. 第k短路----A*算法

    题目链接 大佬题解:https://www.acwing.com/solution/content/21233/ #include <iostream> #include <cstr ...

  3. A*算法的认识与求第K短路模板

    现在来了解A*算法是什么 现在来解决A*求K短路问题 在一个有权图中,从起点到终点最短的路径成为最短路,第2短的路成为次短路,第3短的路成为第3短路,依此类推,第k短的路成为第k短路.那么,第k短路怎 ...

  4. ACM-ICPC 2018 沈阳赛区网络预赛 D. Made In Heaven (K短路算法模板)

    题意 : 求第k短路的权值是否超过T(权值) 解法: 网上随便找的一个求K短路的算法模板套弄一下即可 (模板要好,不然邻接表存图会TLE , 网上换了两个模板才AC的) AC代码: #include& ...

  5. POJ--2449--Remmarguts#39; Date【dijkstra_heap+A*】第K短路

    链接:http://poj.org/problem?id=2449 题意:告诉你有n个顶点,m条边,并把这些边的信息告诉你:起点.终点.权值.再告诉你s.t.k.需求出s到t的第k短路,没有则输出-1 ...

  6. k短路 k shortest path 入门

    K短路求解算法常用的有djstra + A* 和 Yen算法.本文主要讲解djstra + A* 先了解下A*中的估值函数 f(n)=g(n)+h(n) f ( n ) = g ( n ) + h ( ...

  7. [jzoj1163]第k短路

    Description Bessie 来到一个小农场,有时她想回老家看看她的一位好友.她不想太早地回到老家,因为她喜欢途中的美丽风景.她决定选择K短路径,而不是最短路径. 农村有 R (1≤R≤100 ...

  8. poj2449(k短路算法)

    K 短路问题(A* 启发式广搜) 1.k 短路问题就是最短路问题的延申,要找出第 k 短的路径.用广搜进行路径查找,第一次找到的 就是最短路,第二次找到的是第 2 短 路⋯以此类推.所以我们只需要一直 ...

  9. ACM-ICPC 2018 沈阳赛区网络预赛 D Made In Heaven(第k短路,A*算法)

    https://nanti.jisuanke.com/t/31445 题意 能否在t时间内把第k短路走完. 分析 A*算法板子. #include <iostream> #include ...

最新文章

  1. python中文注释缩进_Python入门学习之注释、行与缩进
  2. 以下关于java中布局管理说法错误的是_对于 Java 中的布局管理器,以下说法中错误的是( )。_2019复习答案_学小易找答案...
  3. MassTransit中RequestResponse基本使用
  4. z变换判断稳定性和因果性_图像处理的仿射变换与透视变换
  5. elementui 上传七牛_element ui使用上传组件上传文件到七牛(qiniu-js)
  6. php微信公众平台开发获取access_token,用CURL出现certificate verify failed错误的解决方法...
  7. Passthrough技术简介
  8. 创建一个 scrapy 爬虫项目
  9. 18个免费视频素材网站,超高清、不限速、无版权、可商用,1秒解决你90%的视频剪辑难题!
  10. 视频教程-Photoshop零基础快速入门及PS照片抠图修饰技巧-Photoshop
  11. 数字图像处理——Sobel算子锐化、Prewitt算子锐化
  12. 滴滴出行A/B测试城市运营分析
  13. 和平精英2023年五月和平小店返场皮肤有哪些
  14. 预测《权游》角色生死,AI算法魔力何在?
  15. Macbook的常用快捷键
  16. PJSIP语音回声优化
  17. 《易语言百集教程》百集高清教程免费下载地址————【Badboy】
  18. 白菜个人导航页2.0
  19. 夫琅禾费单缝衍射matlab分析,夫琅禾费单缝衍射光强分布MATLAB分析毕业设计论文...
  20. linux下intel 82579LM 网卡驱动安装

热门文章

  1. jquery实现滚动条滚动到一定高度导航固定不变
  2. 【29.70%】【codeforces 723D】Lakes in Berland
  3. ubuntu16.04下配置caffe无GPU
  4. The Constructor with No Arguments
  5. weblogic配置domain和删除domain
  6. PHP漏洞之session会话劫持
  7. Server Tomcat v6.0 Server at localhost was unable to stat within 45 seconds
  8. 一步一步学Remoting
  9. PyTorch进行神经风格转换/迁移(Neural-Transfer:图像风格迁移)
  10. 为什么matlab生成的exe文件只能在matlab中打开,在电脑的其他地方打不开?