最短哈密顿路径 c语言算法,最短路径系列【最短路径、哈密顿路等】

最短路径问题,一个经典算法问题。本文粗略总结了一种常见的最短路径算法,以及几个最短路径变种问题的解法,其中包括哈密顿路。对于有向图或者无向图,假设有V个节点,E条边,G[Vi,Vj]表示图中点Vi到Vj边的权值。dist[i]表示:点s到点i的最短路径。

一、单源最短路径

给定图G,求点对s->t之间的最短路径,该问题使用经典的dijkstra算法即可解决,时间复杂度O(V^2)。基本思想:两个集合S,T,S表示已经访问的点集合,T表示未访问的点集合,S初始为空,T包括所有点;每次从T集合中选取从s到该点距离最小的点cur,然后将点cur加入到S中(保证从s到S集合中的点之间的路径长度最小),并且基于cur点为跳板,做松弛操作,更新s到T集合中其他点的距离,松弛操作即,如果dist[j]

> dist[cur] + G[cur,j],更新dist[j] =

dist[cur]+G[cur,j],其中j属于T集合;当cur==t时算法结束。

二、有负权边的图的单源最短路径

对于(一)中的dijkstra算法,是否可以用于求解带负权边的单源最短路径问题呢?用三元组(x,y,w)表示一条边权为w的从点x到点y的有向边。先举例看看,假设图中包含3个节点,包含3条边:(1,2,-3)、(2,3,1)、(3,1,1),从图可以看出为一个环1->2->3->1,且环的边权总权值为-3+1+1=-1,那么通过一直循环,那么图中任意两点之间的最短路径都为-oo大,因此不能通过dijkstra来求解最短路径,因为出现负环之后破坏了“从s到集合S中点之间路径长度最小”这点,通过负环的循环,s到S中点之间的路径长度还可以变小。

对付有负权边的单源最短路径问题,可以采用bellman-ford算法、SPFA算法。

Bellman-ford算法思想:dist[s] = 0,其他点i

,dist[i]=oo。进行V-1次循环,每一次循环:对图每一条边E(i,j)两边的点做松弛操作,如果dist[j]

> dist[i] + G[i,j],更新dist[j] =

dist[i]+G[i,j]。完成V-1次循环后,进行判断:如果存在一条边E(i,j),如果dist[i]+G[i,j]

<

dist[j],那么图中存在负权环。如果不存在负权环,则dist[t]为从s到t的最短路径。算法复杂度O(VE)。

SPFA算法思想:维护一个队列Q,队列初始只有s点,一个标记数组flag,flag[i]=1表示节点i在队列中,否则表示不在队列中,一个cnt数组,cnt[i]标记点i进入队列的次数。求队首元素cur,对于边E(cur,j),进行松弛操作:如果dist[j]

> dist[cur] + G[cur,j],更新dist[j] =

dist[cur]+G[cur,j],如果j不在队列中,则将j加入队尾,同时判断j进入队列次数是否大于V-1,如果大于V-1,说明存在负权环,算法结束,否则一直进行,直到队列为空为止。算法复杂度O(2E)。

三、大规模的图,顶点多的稀疏图

Dijkstra算法复杂度为O(V^2),如果图的规模太大,那么无疑难以胜任。其实,对与规模大的图,可以使用min-heap优化,复杂度O((V+E)logV)。思想:维护一个最小堆,用于优化Dijkstrak中从T选取从s到T中路径最短的点,该点即堆顶元素。这个方法即A*搜索。

四、全源最短路径问题

全源最短路径即求出图中任意点对之间的最短路径。方法(1):枚举任意点对,采用dijkstra算法求解即可,复杂度O(V^4)。方法(2):以每一个点为松弛操作的中间点,枚举其他两点,进行松弛操作,即可得到全源最短路径,这便是鼎鼎大名的floyd算法,其状态转移方程如下:

G[i,j]=min{G[i,k]+G[k,j],G[i,j]},时间复杂度O(V^3)。

五、最短哈密顿路径

从s出发到达t,且经过图中每个点至少一次的最短路径长度。这个问题是一个NPC问题,没有高效的解法。假设有N个点,那么N位bit来标记那些点已经访问过,哪些没有访问过。设f[I][J]表示,从s出发达到J,且经过了I中对应位标记为1的所有点的最短路径。有方程如下:

f[I1][J1] = min{F[I][J] + G[J][j],

枚举I,J,j,其中(I&(1<

== 0 &&

(I|(1<

&&

(I&(1<

初始只f[(1<

从改点出发,利用上述方程推出所有的中间变量,包括结果f[(1<

六、第K短路径问题

求s到t的第k短路径,如果k=1,直接采用dijkstra算法即可求解。如果k=2的话,首先采用dijkstra算法求解最短路径,然后枚举删除最短路径上边,再次进行dijkstra算法,求解最短路径即为第k短路径。

理论一:A*算法求解到的路径是最短的。

根据理论一就可以用A*路径求得最短路径,比dijkstra盲目式算法效率高。

假设用A*算法求得最短路径时,即第一次搜索到目标节点后不停止。继续启发式搜索下去,那么根据理论一可以得到第二次搜索到目标节点的路径是第二短路径。依次类推得到第k短路径。

那么A*算法的h’(x)怎么设计呢?

已知h’(x)与h(x)越接近,时间效率越好,h(x)为x到目标节点的实际最短路长。既然这样那么直接取最好值,先用dijkstra算法算出各点到目标节点的最短路径作为估价值h’(x),使效率到达极大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550267.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android应用开发学习笔记之多线程与Handler消息处理机制

作者&#xff1a;刘昊昱 博客&#xff1a;http://blog.csdn.net/liuhaoyutz 和JAVA一样&#xff0c;Android下我们可以通过创建一个Thread对象实现多线程。Thread类有多个构造函数&#xff0c;一般通过构造函数Thread(Runnable runnable)实现多线程&#xff0c;代码如下&#…

nsga2算法c++实现_Bellman-Ford算法

之前文章对于Dijkstra算法进行了讲解和实现&#xff0c;其实现的原理在于采用贪心算法&#xff0c;遍历N(结点数)次&#xff0c;每次找到局部最优的路径的结点u&#xff0c;判断该节点可达的顶点v的权重是否大于结点u权重u->v的权重&#xff0c;如果大于则替换顶点v的权重(也…

JSTL详解(一)

将jstl.jar包导入到工程中 jstldemo1.jsp <% taglib prefix"c" uri"http://java.sun.com/jsp/jstl/core" %> <% page contentType"text/html; charsetgb2312" language"java" %> <c:set var"userName&quo…

android 获取phone实例,Android ContentProvider获取手机联系人实例

在做项目的时候&#xff0c;因为要用到我们自动获取联系人的姓名和电话&#xff0c;就想到了ContentProvider分享数据的功能&#xff0c;这样做既节省了时间&#xff0c;也减少了我们输入错误号码的几率&#xff0c;所以&#xff0c;想在这里把小demo分享给大家&#xff0c;方便…

电脑长截图软件_电脑屏幕长截图+WORD文档里没有插入PDF文件选项时怎么办? 简单一招轻松完成...

111111办 公 小 技 巧在用电脑查看网页时&#xff0c;想把网页上的内容截下来&#xff0c;保存成一张图片&#xff0c;可是内容又不全在一屏里&#xff0c;不能简单的用截屏完成&#xff0c;这时怎么办&#xff1f;想把一个PDF文件插入到WORD文档里&#xff0c;而电脑里的WORD版…

年终总结

时光飞逝,岁月如风,不知不觉新的一年来临了,回顾2010自己收获还是挺多的。虽然钱没余到多少&#xff0c;但是更多的是让我得到了成长、获得了经验。 我是8月份来到了爸妈在线的&#xff0c;很荣幸成为了爸妈在线的一员&#xff0c;同时也很高兴加入了技术研发部这个部门&#x…

Goland配置leetcode

1. 安装 首先在goland的setting界面上找到Plugins&#xff0c;然后搜索关键字leetcode&#xff0c;找到LeetCode Editor&#xff0c;安装它。 在安装后&#xff0c;第一次需要对其进行配置&#xff0c;在Tools中找到LeetCode Plugins&#xff0c;如下图所示进行配置。首先国内…

华为联发科可以升级鸿蒙吗,华为鸿蒙系统降临!首批升级手机确定,联发科芯片被放弃?...

原标题&#xff1a;华为鸿蒙系统降临&#xff01;首批升级手机确定&#xff0c;联发科芯片被放弃&#xff1f;按照计划&#xff0c;华为会在4月份逐渐开放鸿蒙系统手机版的升级&#xff0c;首批可升级的机型目前华为只确定了Mate X2。虽然说这两年采用华为自主芯片的手机&#…

python 多关键字匹配_使用django的objects.filter()方法匹配多个关键字的方法

介绍&#xff1a;今天在使用django的时候忽然想用到&#xff0c;如何匹配多个关键字的操作&#xff0c;我们知道django有一个objects.filter()方法&#xff0c;我们可以通过如下一句代码实现匹配数据库中title包含key关键词的文章名称。table.objects.filter(title__containske…

js中一些怪异的写法

1、var s (10)||{name:janey}   因为10是false,按照或运算规则&#xff0c;继续运算&#xff0c;得到{name:janey} &#xff0c;所以s{name:janey}   同理 var s (11)||{name:janey}&#xff0c;这时11为true,不再继续运算下去&#xff0c;所以strue;   或运算的结果并…

wordpress html页面缓存 cdn,WordPress 下老旧又高效的本地缓存插件 cos-html-cache

摘要Cos Html Cache是一种非常有效的WordPress页面缓存插件可以让你的站点更快更灵敏。基于URL重写&#xff0c;插件将自动生成HTML文件的帖子真正当他们第一次加载&#xff0c;并自动更新HTML文件。说起 WordPress 的缓存插件来对明月来说绝对是个老生常谈的话题了&#xff0c…

python记忆式键入_Python基础

一。基础1.输出与输入&#xff1a;输出&#xff1a;print(变量/字符串)输入&#xff1a;input() 返回的是字符串priceinput()print(price)2.python风格(1)注释 #(2)一般情况是一行结束该句结束&#xff0c;但是如果想要续行&#xff0c;在行的结尾加上 \(3)无需换行符也可以换行…

使用动软代码生成器的注意事项

使用动软代码生成器的注意事项 C# 2011-01-17 21:58:39 阅读21 评论0 字号&#xff1a;大中小 订阅 使用动软代码生成器的注意事项 工厂模式&#xff1a; 一、利用动软生成项目&#xff0c;设置顶级命名空间。二、打开所生成的项目&#xff0c;检查每一层是否为独立的程序集…

html5视差滚动效果,视差滚动效果

插件描述&#xff1a;制作视差滚动效果The meat and potatoes. Invoking these will move that page in from that side.parallax.bar.left(); //Bar slides in from the leftparallax.foo.top(); //bringing back foo from the topparallax.bar.bottom(IAmBack()); //We got c…

Oracle--基础

Oracle数据库的体系结构 数据库: databaseOracle数据库是数据的物理存储,和mysql不一样的是,只要我们愿意,我们就可以在mysql下创建任意的数据库,每个新项目的启动,创建一个数据库,然后通过showdatabases可以查看到全部数据库,但是Oracle的数据库是一个操作系统只有一个库,说白…

python自动化测试常见面试题二_思考|自动化测试面试题第二波

本内容为企业面试关于自动化测试的考题&#xff0c;大家可以自己思考下如何作答&#xff0c;欢迎把答案留言到本文下方哦。问题1&#xff1a;设计接口测试⽤用例例时&#xff0c;涉及的是电商系统&#xff0c;其中包括很多修改&#xff0c;如商品、商家、店铺等等&#xff0c;针…

html动态跟随鼠标效果,使用JS实现气泡跟随鼠标移动的动画效果

气泡跟随鼠标移动&#xff0c;并在每次点击时产生不同的变化效果如下简单的气泡效果body{background-color:#000000;margin:0px;overflow:hidden}var canvas document.createElement(canvas),context canvas.getContext(2d),windowW window.screen.width ,windowH window.s…

raspberry ssh 允许 root 登录

参考链接 csdn 转载于:https://www.cnblogs.com/eat-too-much/p/11153213.html

python开发转行做数据分析_转行学IT,Java、Python、大数据选择学哪个发展好?

对薪资不满意、担心自己以后不好找工作&#xff0c;不少人都会选择参加培训&#xff0c;转行IT行业。当然很多想要转行IT的人&#xff0c;都会犹豫选择哪门编程语言学习比较好&#xff0c;Python、Java、大数据作为比较热门行业技术&#xff0c;不少人都很疑惑转行学Java、Pyth…

html显示线条流动效果,css3实现线条流动效果

1实现原理&#xff1a;通过animation中的clip实现对div的不断切割首先要弄懂clip的含义&#xff0c;四个参数分别是上右下左&#xff0c;以上和左为标准。clip使用的前提是元素绝对定位。本来想实现这样效果看起来是需要3个div&#xff0c;但是根据前人的经验&#xff0c;使用b…