检测无向图中的循环-查找联合

问题描述

这可能是针对另一个社区的,但我想我会先在这里尝试。我知道与该主题相关的几篇文章,但我试图更好地理解该问题。

我一直在跟踪有关这个确切问题的帖子here,并在伟大的Abul Bari的陪同下观看this video

我已经提出了以下内容(借助材料和示例)

class Graph
{
    public $graph;

    function __construct(){
        $this->graph = array();
    }

    // Function: Adds an edge to the graph 
    function addEdge($x,$y){
        $this->graph[$x][] = $y;
    }

    function CycleExists(){

        // Recursively searches for parent of a vertex
        $findParent = function($array,$i) use (&$findParent){
            return ($array[$i] === -1) ? $i: $findParent($array,$array[$i]);
        };

        $union = function($array,$x,$y,$findParent) use (&$union){
            $sx = $findParent($array,$x);
            $sy = $findParent($array,$y);
            $array[$sx] = $sy;
            return $array;
        };

        // Initialize
        foreach (array_keys($this->graph) as $v){
            $array[$v] = -1;
        }

        foreach ($this->graph as $i => $j){
            foreach ($j as $m){

                $x = $findParent($array,$i);
                $y = $findParent($array,$m);

                if ($x === $y){
                    return true;
                } else {
                    $array = $union($array,$findParent);
                }
            }
        }

        return false;
    }

}

    $graph->addEdge(0,1);
    $graph->addEdge(1,2);
    $graph->addEdge(2,0);
    var_dump($graph->CycleExists());
    // should return true

    $graph->graph = array();

    $graph->addEdge(0,3);
    $graph->addEdge(3,4);
    $graph->addEdge(4,INF);
    var_dump($graph->CycleExists());
    // should return false

我希望的是一种确定的测试,该测试应返回true,而该测试应返回false。我已经有一个示例,该示例应返回true,但我想我的false示例不正确 OR CycleExists()存在问题。我是算法的新手,因此希望能详细解释我要去哪里。

编辑:我很好奇这个问题是否仅与我创建边缘的方式有关,而我无法创建直线之类的东西。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)