'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); } } ?>