java邻接矩阵查询路径_【转】图-最小路径

这里使用的是Dijkstra来计算最短路径。事实上Dijkstra完成时,指定节点到所有节点的最小路径均已求出。

算法简述如下:

准备好两个辅助性数据结构:

1 ParentLength : 用来记录到当前节点之前的父节点,与到当前节点的最小路径

2 Path: 记录指定节点到所有节点的ParentLength。初始化时,所有的ParentLength的父节点都为指定的起始节点,长度都是INFINITY,代表没有联通,距离无穷大。

Path的关键算法是adjust(from,to,length),每当发现一条新的,从一个已访问的节点(from)到未访问的节点(to)之间的新路径时,Path则用其更新ParentLength列表,重新计算到那个未访问节点(to)的最新距离:以前到from节点的距离+新的距离,然后比较它与to节点对应的ParentLength老的距离之间的长度,如果新距离短,则将to节点对应的ParentLength更新为长度为新距离的,父节点为from;以此步骤保证Path总是保持当前遍历状态下,到各个节点的最短路径。

Path的另一个关键算法是getMin,它会返回到所有未访问节点中,最短的路径的那个节点。

图使用邻接矩阵法表示,关于邻接矩阵可参见:Graph 图-邻接表法

Graph.path是最小路径算法,工作方式如下:

根据指定的起始节点初始化返回值Path对象。

将指定的起始节点标志为已访问。并设置为当前节点。

然后

1 找到当前节点所有联通的未知节点,和到这些路径长度,调用Path.adjust更新Path。

2 步骤 1 结束后,从调用Path.getMin获得到所有未访问节点中,最短的路径的那个节点。标志为访问过,并作为当前节点。

3 重复 步骤 1 步骤 2 n次(n为图中的节点数量),算法结束。

代码中的Path.print()为打印函数,为测试之用。

Path.main()提供简单测试。

1

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifclassParentLength9b8a8a44dd1c74ae49c20a7cd451974e.png{//记载上一个节点与当前最小路径2d18c02628675d0a2c816449d98bda930.pngprivateintparent;//上一个节点3d18c02628675d0a2c816449d98bda930.pngprivateintlength;//最小路径长度497e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifParentLength(intparent,intlength)9b8a8a44dd1c74ae49c20a7cd451974e.png{5d18c02628675d0a2c816449d98bda930.pngthis.parent=parent;6d18c02628675d0a2c816449d98bda930.pngthis.length=length;7ecedf933ec37d714bd4c2545da43add2.png    }8d18c02628675d0a2c816449d98bda930.png997e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifintparent()9b8a8a44dd1c74ae49c20a7cd451974e.png{returnparent; }1097e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifintlength()9b8a8a44dd1c74ae49c20a7cd451974e.png{returnlength; }118f1ba5b45633e9678d1db480c16cae3f.png}124f1150b881333f12a311ae9ef34da474.png131fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifclassPath9b8a8a44dd1c74ae49c20a7cd451974e.png{//存储最小路径14d18c02628675d0a2c816449d98bda930.pngprivateParentLength[] pls;15d18c02628675d0a2c816449d98bda930.pngprivateGraph g;//确定指定位置的节点是否被访问过和打印时使用1697e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifPath(intsize,intstart, Graph g)9b8a8a44dd1c74ae49c20a7cd451974e.png{17d18c02628675d0a2c816449d98bda930.png//初始化最小路径数组,将所有最小路径的起点都置为start,并将路径长度置为INFINITY18d18c02628675d0a2c816449d98bda930.pngpls=newParentLength[size];19d18c02628675d0a2c816449d98bda930.pngfor(inti=0; i            pls[i]=newParentLength(start,Graph.INFINITY);21d18c02628675d0a2c816449d98bda930.pngthis.g=g;22

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值