使用graphp可以快速枚举两个节点之间的所有路径吗?

时间:2015-04-25 05:54:14

标签: php

使用Graphp(PHP库)有一种快速简便的方法来枚举两个节点之间所有独特的无循环路径,或者我是否需要创建一个算法对象来实现这一目标?

1 个答案:

答案 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
    )
)

所以我将继续玩代码,看看我是否能提出更好的解决方案。感谢。