如何解决检测无向图中的循环-查找联合
这可能是针对另一个社区的,但我想我会先在这里尝试。我知道与该主题相关的几篇文章,但我试图更好地理解该问题。
我一直在跟踪有关这个确切问题的帖子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 举报,一经查实,本站将立刻删除。