微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决检测无向图中的循环-查找联合

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

我一直在跟踪有关这个确切问题的帖子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 举报,一经查实,本站将立刻删除。