要在一个无向连通图结构中求出两个结点之间的全部路径,算法要求是在所的得到的路径上不能含有环路或重复的点。
我的想法是:
第一是要整理结点之间的关系,为每个节点建立一个集合,该集合中保存所有与该结点直接相连的结点,不包括该结点本身。
第二要定义两个结点,一个为初始结点,一个为终点结点,求解两者之间的路径可以理解为下面的子问题:对每一个与起始结点直接相连的结点,求解它到终点结点的所有路径(路径上不包括起始结点)得到一个路径集合,将这些路径集合相加就可以得到从起始节点到终点结点的全部路径;以此类推就可以使用递归的思想,层层递归直到终点结点,若发现得到的一条路径,就输出,若发现环路或者死路,就停止搜索并返回。
第三,用栈保存当前已经寻找到的路径结点(不是完整路径),在每一次寻到完整路径时弹出栈顶结点;而在遇到栈顶结点无法继续向下寻路时也弹出该栈顶结点,从而实现回溯。
我来解释一下寻找路径的具体方法:
首先判断路径是否是回路或者环路,如果符合条件判断说明出现环路,不能再顺着该路径继续寻路,返回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为起始结点到终点的路径已经全部找到。
此为Node.java,主类中的子类,表示一个结点以及和这个结点相连的所有结点
此为test.java,主类,运行后输出从初始结点到终点结点的所有路径。