您好,欢迎访问一九零五行业门户网

PHP实现图的邻矩阵及普利姆算法(Prim)

'10', 'af'=>'11', 'bg'=>'16', 'fg'=>'17', 'bc'=>'18', 'bi'=>'12', 'ci'=>'8', 'cd'=>'22', 'di'=>'21', 'dg'=>'24', 'gh'=>'19', 'dh'=>'16', 'de'=>'20', 'eh'=>'7','fe'=>'26');//键为边,值权值           $test = new mgraph($a, $b);     print_r($test->prim()); ?> //mgraph.php vexs = $vexs;             $this->arcdata = $arc;             $this->direct = $direct;             $this->initalizearc();             $this->createarc();          }          private function initalizearc(){             foreach($this->vexs as $value){                 foreach($this->vexs as $cvalue){                     $this->arc[$value][$cvalue] = ($value == $cvalue ? 0 : $this->infinity);                 }             }         }          //创建图 $direct:0表示无向图,1表示有向图         private function createarc(){             foreach($this->arcdata as $key=>$value){                 $strarr = str_split($key);                 $first = $strarr[0];                 $last = $strarr[1];                                   $this->arc[$first][$last] = $value;                 if(!$this->direct){                     $this->arc[$last][$first] = $value;                  }             }         }          //prim算法,生成最小生成树         public function prim(){             $this->primvexs = array();             $this->primarc = array($this->vexs[0]=>0);                          for($i = 1; $i count($this->vexs); $i ++){                 $this->primarc[$this->vexs[$i]] = $this->arc[$this->vexs[0]][$this->vexs[$i]];                 $this->primvexs[$this->vexs[$i]] = $this->vexs[0];             }              for($i = 0; $i count($this->vexs); $i ++){                 $min = $this->infinity;                 $key;                  foreach($this->vexs as $k=>$v){                     if($this->primarc[$v] != 0 && $this->primarc[$v] $min){                         $key = $v;                         $min = $this->primarc[$v];                     }                 }                  $this->primarc[$key] = 0;                  foreach($this->arc[$key] as $k=>$v){                     if($this->primarc[$k] != 0 && $v $this->primarc[$k]){                         $this->primarc[$k] = $v;                           $this->primvexs[$k] = $key;                      }                 }             }              return $this->primvexs;         }          //一般算法,生成最小生成树         public function bst(){             $this->primvexs = array($this->vexs[0]);             $this->primarc = array();              next($this->arc[key($this->arc)]);              $key = null;             $current = null;              while(count($this->primvexs) count($this->vexs)){                 foreach($this->primvexs as $value){                     foreach($this->arc[$value] as $k=>$v){                         if(!in_array($k, $this->primvexs) && $v != 0 && $v != $this->infinity){                             if($key == null  $v $current)){                                 $key = $k;                                 $current = array($value . $k=>$v);                             }                         }                      }                 }                  $this->primvexs[] = $key;                 $this->primarc[key($current)] = current($current);                 $key = null;                 $current = null;             }              return array('vexs'=>$this->primvexs, 'arc'=>$this->primarc);         }          //一般遍历         public function reserve(){             $this->haslist = array();              foreach($this->arc as $key=>$value){                 if(!in_array($key, $this->haslist)){                     $this->haslist[] = $key;                 }                  foreach($value as $k=>$v){                     if($v == 1 && !in_array($k, $this->haslist)){                         $this->haslist[] = $k;                        }                 }             }              foreach($this->vexs as $v){                 if(!in_array($v, $this->haslist))                     $this->haslist[] = $v;             }              return implode($this->haslist);         }          //广度优先遍历         public function bfs(){             $this->haslist = array();             $this->queue = array();                          foreach($this->arc as $key=>$value){                 if(!in_array($key, $this->haslist)){                     $this->haslist[] = $key;                     $this->queue[] = $value;                      while(!emptyempty($this->queue)){                         $child = array_shift($this->queue);                                                  foreach($child as $k=>$v){                             if($v == 1 && !in_array($k, $this->haslist)){                                 $this->haslist[] = $k;                                 $this->queue[] = $this->arc[$k];                                }                         }                     }                 }             }              return implode($this->haslist);                       }          //执行深度优先遍历         public function excutedfs($key){             $this->haslist[] = $key;                foreach($this->arc[$key] as $k=>$v){                 if($v == 1 && !in_array($k, $this->haslist))                     $this->excutedfs($k);                }         }          //深度优先遍历         public function dfs(){             $this->haslist = array();              foreach($this->vexs as $key){                 if(!in_array($key, $this->haslist))                      $this->excutedfs($key);              }              return implode($this->haslist);         }         //返回图的二维数组表示         public function getarc(){             return $this->arc;         }         //返回结点个数         public function getvexcount(){             return count($this->vexs);         }     } ?> 
其它类似信息

推荐信息