博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
求图的第K短路(A*算法与最短路的应用)
阅读量:6223 次
发布时间:2019-06-21

本文共 1956 字,大约阅读时间需要 6 分钟。

前言:最短路算法是我们非常熟悉的了。Dijkstra,SPFA等单源最短路算法是我们在竞赛中常用的算法。那么,假如题目要求的不是最短的呢?

Question(1):给定一个图,求次短路。

对于次短路,很容易想到在比较的时候进行处理。

设dis(u)为原点s到u的最短路径,u为当前节点,v和u有边相连。

x = dis[v] + f[u][v];

则对于最短路:if(dis[u] > x) dis[u] = x;

而对于次短路:

if(dis[u]>x) dis2[u]=dis[u],dis[u]=x;

else if(dis2[u]>x) dis2[u]=x;

所以,对于次短路,只需加多一个数组即可。

那么,K短路呢?

Question(2):给定一个图,求第K短路。

对于这个问题,可以用A*算法+Dijkstra解决。

先了解一下A*算法:

A*算法是一种典型的启发式搜索算法。定义:

h*(s)为状态s到目标的距离

h(s)为估价函数,状态s到目标距离的下界,即h(s)<=h*(s)

g(s)为到达状态s所需的代价

f(s)为s的启发函数。有f(s) = h(s) + g(s)。

那么,对于本题:h(s)就是源点到s的距离,g(s)为到终点t的实际距离。

如果能求出g,那么,当A*搜索了终点k次后,当前的h就为答案。

求函数g的方法:因为g(s)为到终点t的实际距离,所以,可以把原图的边反向后,把终点改成源点,跑一次Dijkstra,算出每一个点u到t的距离,就是所求的g。

附上求K短路的模板:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define Maxn 10010#define INF 1000000000struct node{ int to,val; node() {} node(int a,int b) { to = a; val = b; }};vector
adj[Maxn],_adj[Maxn];int n,m,k;bool vis[Maxn];int dis[Maxn];void AddEdge(int x,int y,int val){ adj[x].push_back(node(y,val)); _adj[y].push_back(node(x,val));//把图反向}void Dijkstra(int s,int t){ priority_queue
, greater
> q; while(!q.empty()) q.pop(); for(int i=1;i<=n;i++) vis[i] = false,dis[i] = INF; vis[t] = true; dis[t] = 0; q.push(t); int u,len; while(!q.empty()) { u = q.top(); q.pop(); len = _adj[u].size(); for(int i=0;i
dis[u] + v.val) { dis[v.to] = dis[u] + v.val; if(!vis[v.to]) { q.push(v.to); vis[v.to] = true; } } } vis[u] = false; }}struct Anode{ int h,g,id; Anode(int a,int b,int c) {h=a; g=b; id=c;} bool operator < (Anode a) const { return h+g > a.h+a.g; }};priority_queue
Q;int Astar(int s,int t)//A*算法过程{ while(!Q.empty()) Q.pop(); Q.push(Anode(0,dis[s],s)); int len,num; num = 0; while(!Q.empty()) { Anode u = Q.top(); Q.pop(); if(u.id==t) ++num; if(num>=k) return u.h; len = adj[u.id].size(); for(int i=0;i

转载于:https://www.cnblogs.com/ouqingliang/p/9245256.html

你可能感兴趣的文章
Linux虚拟主机通过程序实现二级域名绑定到子目录
查看>>
7.12. cvs diff
查看>>
Android酷炫实用的开源框架(UI框架)
查看>>
Winform开发框架之对话框样式同化
查看>>
一脸懵逼学习Linux的Shell编程
查看>>
Jmeter调试工具---Debug Sampler
查看>>
[裴礼文数学分析中的典型问题与方法习题参考解答]4.5.14
查看>>
impdp的TABLE_EXISTS_ACTION参数选项
查看>>
机器学习之深入理解神经网络理论基础、BP算法及其Python实现
查看>>
ecshop设置一个子类对应多个父类并指定跳转url的修改方法
查看>>
【spring源码学习】spring的事务管理的源码解析
查看>>
遇见喜欢数学的女孩
查看>>
linux进程资源占用高原因分析命令记录
查看>>
【转】solr+ajax智能拼音详解---solr跨域请求
查看>>
SOA架构设计经验分享—架构、职责、数据一致性
查看>>
微信开发之推广支持
查看>>
第 50 章 Resin
查看>>
服务器操作系统应该选择Debian/Ubuntu还是CentOS?
查看>>
Hbase集群master.HMasterCommandLine: Master exiting
查看>>
程序员面试宝典——总结
查看>>