java节点回路检查_Java在图结构中求两个结点之间的全部路径

本文介绍如何在无向连通图中,使用Java实现从一个节点到另一个节点的所有无环路径的查找算法。通过递归方法,避免环路并存储路径节点,当发现环路时停止搜索,直至找到所有可能的路径。
摘要由CSDN通过智能技术生成

要在一个无向连通图结构中求出两个结点之间的全部路径,算法要求是在所的得到的路径上不能含有环路或重复的点。

我的想法是:

第一是要整理结点之间的关系,为每个节点建立一个集合,该集合中保存所有与该结点直接相连的结点,不包括该结点本身。

第二要定义两个结点,一个为初始结点,一个为终点结点,求解两者之间的路径可以理解为下面的子问题:对每一个与起始结点直接相连的结点,求解它到终点结点的所有路径(路径上不包括起始结点)得到一个路径集合,将这些路径集合相加就可以得到从起始节点到终点结点的全部路径;以此类推就可以使用递归的思想,层层递归直到终点结点,若发现得到的一条路径,就输出,若发现环路或者死路,就停止搜索并返回。

第三,用栈保存当前已经寻找到的路径结点(不是完整路径),在每一次寻到完整路径时弹出栈顶结点;而在遇到栈顶结点无法继续向下寻路时也弹出该栈顶结点,从而实现回溯。

我来解释一下寻找路径的具体方法:

首先判断路径是否是回路或者环路,如果符合条件判断说明出现环路,不能再顺着该路径继续寻路,返回false,如下:

if (cNode != null && pNode != null && cNode == pNode)

return false;

其中Node: 当前的起始节点currentNode

* pNode: 当前起始节点的上一节点previousNode

* sNode: 最初的起始节点startNode

* eNode: 终点endNode

如果不是环路或者回路,那么起始结点入栈,如果该起始结点就是终点,转储并打印输出该路径,返回true,如果不是,继续寻路,从与当前起始结点cNode有连接关系的结点集中按顺序遍历得到一个结点,作为下一次递归寻路时的起始结点,如果nNode是最初的起始结点或者nNode就是cNode的上一节点或者nNode已经在栈中,说明产生环路 ,应重新在与当前起始结点有连接关系的结点集中寻找nNode,以nNode为新的起始结点,当前起始结点cNode为上一节点,递归调用寻路方法,如果找到一条路径,则弹出栈顶结点,继续在与cNode有连接关系的结点集中测试nNode,当遍历完所有与cNode有连接关系的结点后,说明在以cNode为起始结点到终点的路径已经全部找到。

2cdf40560751da55f5ecc2c0203d94df.png

此为Node.java,主类中的子类,表示一个结点以及和这个结点相连的所有结点

4675f32d004afcd0be6b3d879a13d193.png

此为test.java,主类,运行后输出从初始结点到终点结点的所有路径。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值