对最路径问题的一些研究.docVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
对最路径问题的一些研究

对最短路径问题的一些研究 赵明阳 【摘要】 图论是信息学奥赛选手必须掌握的知识,而最短路径问题是图论是比较基础的内容,本文对各种不同情况的图中的最短路径作了一些总结。 【关键字】信息学 、最短路径、 Dijkstra、Ford、Bellman-ford、SPFA 图是较线性表和树更为复杂的一种数据结构。 在这种数据结构中,数据节点间的联系是任意的,因此他可以更广泛的表示数据元素之间的关系。图结构在人工智能、数学、物理、化学、计算机科学等许多领域被广泛应用。信息学奥赛的许多试题,也需要用图来描述数据元素之间的联系。最短路径问题就是图论里一个比较重要的算法,下面我就几种不同种类的图,给出不同的求解算法。 一、不带负权回路的图 在带权图G=(V,E)中,若顶点 Vp,Vq是图G的两个顶点,从顶点Vp到Vq的路径长度定义为路径上各条边的权值之和。从顶点Vp到Vq可能有多条路径,其中路径长度最短的一条路径称为顶点Vp到Vq的最短路径。有两类最短路径问题:一是求从某个顶点(源结点)到其它顶点(目的结点)的最短路径问题。这类问题我们称之为单源最短路径问题。二是求图中每一对顶点间的最短路径。 如下例,右图是六个城市之间道路联系的示意图,连线表示两城市间有道路相通,连线旁的数字表示路程。请编写一程序,由计算机找出从C1到C6之间路长最短的一条路径,输出路径序列及总长度。 像这个题目,我们既可以用单源最短路径算法来解决,也可以先求出每对顶点的最短路径,然后输出C1到C6之间的最短路径。 单源最短路径算法当然首推Dijkstra算法。Dijkstra算法的 基本思想是:设置一个顶点的集合s,并不断地扩充这个集合,一个顶点属于集合s当且仅当从源点到该点的路径已求出。开始时s中仅有源点,并且调整非s中点的最短路径长度,找当前最短路径点,将其加入到集合s,直到终点在s中。 主要程序部分如下: ?read(first,tail); ? for i:=1 to n do dist[i]:=max; ?dist[first]:=0; ?s:=[first]; u:=first; ?while utail do ?? begin ?? for? j:= 1 to n do ??? if not(j in s) and (dist[u]+cost[u,j]dist[j]) then ???? begin dist[j]:=dist[u]+cost[u,j]; path[j]:=u end; ?? min:=max; ?? for j:=1 to n do ??? if not(j in s) and (dist[j]min) then begin u:=j; min:=dist[j];end; ?? if min=max then begin writeln(No answer); halt end; ?? s:=s+[u]; ? end; writeln(dist[first,tail]) 这个算法的时间复杂度O(n*n)。 若要求每对点之间的最短路,可以用Ford算法。算法思想为:不停地调整图中的顶点值(源点到该点的最短路径值),直到没有点的值调整了为止。 主要程序段如下: For k:=1 to n do For i:=1 to n do For j:=1 to n do if dis[i,j]dis[i,k]+dis[k,j] then dis[i,j]=dis[i,k]+dis[k,j] writeln(dist[first,tail]) 这个算法的时间复杂度O(n*n*n),编程复杂度较低。 二、带有负权回路的图 在一个图里每条边都有一个权值(有正有负) ,如果存在一个环(从某个点出发又回到自己的路径),而且这个环上所有权值之和是负数,那这就是一个负权环,也叫负权回路 存在负权回路的图是不能求两点间最短路的,因为只要在负权回路上不断兜圈子,所得的最短路长度可以任意小。对于带有负权回路的图,上面两种算法就不适合用了,那么我们可以采用Bellman-ford算法,算法思想: 1.对每条边进行|V|-1次Relax操作; 2.如果存在(u,v)∈E使得dis[u]+wdis[v],则存在负权回路;否则dis[v]即为s到v的最短距离,pre[v]为前驱。 主要程序段如下: ?For i:=1 to n-1 do ?For j:=1 to e do ? with edges[j] do ?? Relax(a,b,w

文档评论(0)

haihang2017 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档