Ejemplo n.º 1
0
 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;
 }