使用Graphp(PHP库)有一种快速简便的方法来枚举两个节点之间所有独特的无循环路径,或者我是否需要创建一个算法对象来实现这一目标?
答案 0 :(得分:0)
好吧,我尝试编写一个快速而又脏的递归函数而不是尝试实现一个graphp算法对象...我需要做一些测试并确保它以正确的格式回吐数据,并且完全没有效率,但我希望得到一些反馈,以便更好地找到我想要的地方:
function Recursive_Find_Paths($GRAPH, $NODE, $DEST, $PATH = array(), $VISITED )
{
$PATHS = array();
array_push( $VISITED,$NODE->getId() ); // Add this node to the list of visited to prevent loops
if ( $NODE->getId() == $DEST->getId() ) { return array($PATH); } // SUCCESS! We found a path to the destination!
foreach ($NODE->getVerticesEdgeTo() as $NEXTNODE)
{
if ( in_array($NEXTNODE->getId(),$VISITED) ) { continue; } // SKIP nodes if we have already visited them!
$NEXTPATH = $PATH; $A = $NODE->getId(); $B = $NEXTNODE->getId();
$NEXTPATH["{$A}->{$B}"] = 0.9;
$MOREPATHS = Recursive_Find_Paths($GRAPH, $NEXTNODE, $DEST, $NEXTPATH, $VISITED);
if ( count($MOREPATHS) ) { $PATHS = array_merge($PATHS,$MOREPATHS); }
}
return $PATHS; // Return the recursively calculated list of paths...
}
它正在返回我正在寻找的东西(我选择了一个关联数组,以便我以后可以根据路径的每条腿粘贴一些Edge详细信息)
假设一个简单的正方形有4个顶点1-> 2,1-> 3,2-> 4,3-> 4我得到这个输出:
Array
(
[0] => Array
(
[1->2] => 0.9
[2->4] => 0.9
)
[1] => Array
(
[1->3] => 0.9
[3->4] => 0.9
)
)
所以我将继续玩代码,看看我是否能提出更好的解决方案。感谢。