我创建了一个带有6个顶点的无向图,可视化表示如下:http://i.imgur.com/EtQyspG.png
我想编写一个脚本,可以从起点找到所有路径,而无需重新访问同一个节点,没有给定的终点。
我所看到的BFS,DFS,A *算法的每个示例都需要一个结束目标节点。但是,在较大的图形上,找到从A点到Z点的所有可能路径可能是NP难的。出于这个原因,我想找到在一定数量的移动中可实现的所有目的地的所有路径(在此图上)例如 - 3个移动= = 4个路径中的最大顶点)
我使用PHP数组编码图形,每个键都是一个顶点,其数组包含相邻的点:
<?php
$graph[1] = array(2,6);
$graph[2] = array(1,4);
$graph[3] = array(4,5);
$graph[4] = array(2,3,6);
$graph[5] = array(6,3);
$graph[6] = array(1,5,4);
我不知道算法,它以这种方式执行路径搜索。我想要的输出是这样的:
Path 1: 1,2
Path 2: 1,2,4
Path 3: 1,2,4,3
Path 4: 1,6
Path 5: 1,6,4,3
Path 6: 1,6,5
Path 7: 1,6,5,3
编写所需代码没有问题,但算法/函数的必要步骤(假设树遍历递归?)很难理解。
问题:应该使用什么方法/算法来做这个,你有一个例子(或者至少是伪代码),它给出了图形输入数组的工作原理吗?
答案 0 :(得分:0)
单个起点和分支告诉您构建树。这只是有限深度的树搜索。在每个级别,您需要修剪已访问过的节点。伪代码在wiki文章
中答案 1 :(得分:0)
嗯,在密集图(| E | ~O(| V | ^ 2))中,输出的大小是最大移动量的指数,并且任何程序都需要时间至少线性的大小它必须输出的数据。
最简单的方法就是采用vanilla递归DFS算法并修改它以便
1)顶点堆栈保存在实际堆栈中(我的意思是数组/向量/ Python列表/等等,无论你在PHP中有什么等价物)。在调用之前将目标顶点插入到它,在调用返回后弹出它。
2)当达到深度k时,该函数将堆栈打印到输出并返回
3)递归函数&#34; unmarks&#34;返回前的当前顶点
虽然我无法帮助您使用PHP。