public function kruskal() { $ufds = new UFDS(); $edgeQ = $this->edgeList; $akeys = array_keys($this->adjList); for ($i = 0; $i < count($akeys); $i++) { $ufds->insert($akeys[$i]); } $edgeSet = array(); usort($edgeQ, 'tripleSort'); //by weight if (!$this->min) { $edgeQ = array_reverse($edgeQ); } $length = count($edgeQ); for ($i = 0; $i < $length; $i++) { $e = array_shift($edgeQ); if (!$ufds->isSameSet($e->from(), $e->to())) { //if does not form cycle $edgeSet[] = $e; $ufds->unionSet($e->from(), $e->to()); } } return $edgeSet; }