第k短路 (A*算法)
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*算法)相关推荐
- 第K短路(A*算法)
给定一张 NN 个点(编号 1,2-N),MM 条边的有向图,求从起点 S 到终点 T 的第 K 短路的长度,路径允许重复经过点或边. 注意: 每条最短路中至少要包含一条边. 输入格式 第一行包含两个 ...
- 第k短路----A*算法
题目链接 大佬题解:https://www.acwing.com/solution/content/21233/ #include <iostream> #include <cstr ...
- A*算法的认识与求第K短路模板
现在来了解A*算法是什么 现在来解决A*求K短路问题 在一个有权图中,从起点到终点最短的路径成为最短路,第2短的路成为次短路,第3短的路成为第3短路,依此类推,第k短的路成为第k短路.那么,第k短路怎 ...
- ACM-ICPC 2018 沈阳赛区网络预赛 D. Made In Heaven (K短路算法模板)
题意 : 求第k短路的权值是否超过T(权值) 解法: 网上随便找的一个求K短路的算法模板套弄一下即可 (模板要好,不然邻接表存图会TLE , 网上换了两个模板才AC的) AC代码: #include& ...
- POJ--2449--Remmarguts#39; Date【dijkstra_heap+A*】第K短路
链接:http://poj.org/problem?id=2449 题意:告诉你有n个顶点,m条边,并把这些边的信息告诉你:起点.终点.权值.再告诉你s.t.k.需求出s到t的第k短路,没有则输出-1 ...
- k短路 k shortest path 入门
K短路求解算法常用的有djstra + A* 和 Yen算法.本文主要讲解djstra + A* 先了解下A*中的估值函数 f(n)=g(n)+h(n) f ( n ) = g ( n ) + h ( ...
- [jzoj1163]第k短路
Description Bessie 来到一个小农场,有时她想回老家看看她的一位好友.她不想太早地回到老家,因为她喜欢途中的美丽风景.她决定选择K短路径,而不是最短路径. 农村有 R (1≤R≤100 ...
- poj2449(k短路算法)
K 短路问题(A* 启发式广搜) 1.k 短路问题就是最短路问题的延申,要找出第 k 短的路径.用广搜进行路径查找,第一次找到的 就是最短路,第二次找到的是第 2 短 路⋯以此类推.所以我们只需要一直 ...
- ACM-ICPC 2018 沈阳赛区网络预赛 D Made In Heaven(第k短路,A*算法)
https://nanti.jisuanke.com/t/31445 题意 能否在t时间内把第k短路走完. 分析 A*算法板子. #include <iostream> #include ...
最新文章
- python中文注释缩进_Python入门学习之注释、行与缩进
- 以下关于java中布局管理说法错误的是_对于 Java 中的布局管理器,以下说法中错误的是( )。_2019复习答案_学小易找答案...
- MassTransit中RequestResponse基本使用
- z变换判断稳定性和因果性_图像处理的仿射变换与透视变换
- elementui 上传七牛_element ui使用上传组件上传文件到七牛(qiniu-js)
- php微信公众平台开发获取access_token,用CURL出现certificate verify failed错误的解决方法...
- Passthrough技术简介
- 创建一个 scrapy 爬虫项目
- 18个免费视频素材网站,超高清、不限速、无版权、可商用,1秒解决你90%的视频剪辑难题!
- 视频教程-Photoshop零基础快速入门及PS照片抠图修饰技巧-Photoshop
- 数字图像处理——Sobel算子锐化、Prewitt算子锐化
- 滴滴出行A/B测试城市运营分析
- 和平精英2023年五月和平小店返场皮肤有哪些
- 预测《权游》角色生死,AI算法魔力何在?
- Macbook的常用快捷键
- PJSIP语音回声优化
- 《易语言百集教程》百集高清教程免费下载地址————【Badboy】
- 白菜个人导航页2.0
- 夫琅禾费单缝衍射matlab分析,夫琅禾费单缝衍射光强分布MATLAB分析毕业设计论文...
- linux下intel 82579LM 网卡驱动安装
热门文章
- jquery实现滚动条滚动到一定高度导航固定不变
- 【29.70%】【codeforces 723D】Lakes in Berland
- ubuntu16.04下配置caffe无GPU
- The Constructor with No Arguments
- weblogic配置domain和删除domain
- PHP漏洞之session会话劫持
- Server Tomcat v6.0 Server at localhost was unable to stat within 45 seconds
- 一步一步学Remoting
- PyTorch进行神经风格转换/迁移(Neural-Transfer:图像风格迁移)
- 为什么matlab生成的exe文件只能在matlab中打开,在电脑的其他地方打不开?