图论算法求两点间所有路径

最近写的算法需要用到这项功能,遂在CSDN上找到了现成的算法。然而,那个算法存在一个不容易绕过去的坑,因此,总结在这里,以作记录。


以下转自https://blog.csdn.net/ha000/article/details/52368566

1建图:

     图类中包括如下信息:顶点集合,邻接矩阵。

     节点类中包括如下信息:是否被访问过,节点的名称,从这个节点访问到下一个节点的集合

 

          

 

 

2 算法思路

  A 将始点设置为已访问,将其入栈

  B 查看栈顶节点V在图中,有没有可以到达、且没有入栈、且没有从这个节点V出发访问过的节点

  C 如果有,则将找到的这个节点入栈

  D 如果没有,则将节点V访问到下一个节点的集合中每个元素赋值为零,V出栈

  E 当栈顶元素为终点时,设置终点没有被访问过,打印栈中元素,弹出栈顶节点

  F 重复执行B – E,直到栈中元素为空

以上转自https://blog.csdn.net/ha000/article/details/52368566


其中,E 当栈顶元素为终点时,设置终点没有被访问过,打印栈中元素,弹出栈顶节点

这一句存在问题。

上述算法当且仅当边结构为邻接矩阵,且所求两点分别是第一个点和最后一个点的时候,才生效。

这是因为,邻接矩阵结构检索节点的方式是有序的。如果栈顶元素为终点,那么,上一个节点从第一个节点遍历到终点,栈顶元素是其检测的最后一个点。因此,此时设置终点没有被访问过,弹出的其实是终点和终点的上一个节点。弹出终点就不用说了,弹出终点的上一个点是因为,我们已经将这个点所有可能的连接都遍历过了。

如果我们利用三元组的方式进行节点遍历,就会出现问题。因为,利用三元组进行遍历,是无序的。谁也不知道什么时候会遍历到终点,终点的上一个点是否还有其他需要遍历的路径。

因此,如果能找到一种方法,使得利用三元组的遍历也是有序的,或者至少保证最后遍历含有终点的路径,就能解决问题。

最后,博主相处了一种改动的方法:设置一个新的数组,存储已经访问过终点的节点。例如,d是终点,有c->d, 那么我们就将c存入数组。在每次将新的节点压入栈之前,判断是否出现这种情况:头节点在数组中,尾节点时终点d。如果这样,就不沿这条路搜索。也就是说,将步骤B改动为:

B 查看栈顶节点V在图中,有没有可以到达、且没有入栈、且没有从这个节点V出发访问过的节点 且若当前节点已访问过终点,还要求目标节点不是终点

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值