当前位置:首页 > PHP教程 > php应用 > 列表

PHP实现克鲁斯卡尔算法实例解析

发布:smiling 来源: PHP粉丝网  添加日期:2021-04-08 20:48:29 浏览: 评论:0 

这篇文章主要介绍了PHP实现克鲁斯卡尔算法实例解析,是PHP程序设计中一个比较经典的应用,需要的朋友可以参考下

本文实例展示了PHP实现的格鲁斯卡尔算法(kruscal)的实现方法,分享给大家供大家参考。相信对于大家的PHP程序设计有一定的借鉴价值。

具体代码如下:

  1. <?php 
  2. require 'edge.php'
  3. $a = array
  4.   'a'
  5.   'b'
  6.   'c'
  7.   'd'
  8.   'e'
  9.   'f'
  10.   'g'
  11.   'h'
  12.   'i' 
  13. ); 
  14. $b = array
  15.   'ab' => '10'
  16.   'af' => '11'
  17.   'gb' => '16'
  18.   'fg' => '17'
  19.   'bc' => '18'
  20.   'bi' => '12'
  21.   'ci' => '8'
  22.   'cd' => '22'
  23.   'di' => '21'
  24.   'dg' => '24'
  25.   'gh' => '19'
  26.   'dh' => '16'
  27.   'de' => '20'
  28.   'eh' => '7'
  29.   'fe' => '26' 
  30. ); 
  31. $test = new Edge($a$b); 
  32. print_r($test->kruscal()); 
  33. ?> 

edge.php文件代码如下:

  1. <?php 
  2. //边集数组的边类 
  3. class EdgeArc { 
  4.   private $begin//起始点 
  5.   private $end//结束点 
  6.   private $weight//权值 
  7.   public function EdgeArc($begin$end$weight) { 
  8.     $this->begin = $begin
  9.     $this->end = $end
  10.     $this->weight = $weight
  11.   } 
  12.   public function getBegin() { 
  13.     return $this->begin; 
  14.   } 
  15.   public function getEnd() { 
  16.     return $this->end
  17.   } 
  18.   public function getWeight() { 
  19.     return $this->weight; 
  20.   } 
  21. class Edge { 
  22.   //边集数组实现图 
  23.   private $vexs//顶点集合 
  24.   private $arc//边集合 
  25.   private $arcData//要构建图的边信息 
  26.   private $krus//kruscal算法时存放森林信息 
  27.   public function Edge($vexsData$arcData) { 
  28.     $this->vexs = $vexsData
  29.     $this->arcData = $arcData
  30.     $this->createArc(); 
  31.   } 
  32.   //创建边 
  33.   private function createArc() { 
  34.     foreach ($this->arcData as $key => $value) { 
  35.       $key = str_split($key); 
  36.       $this->arc[] = new EdgeArc($key[0], $key[1], $value); 
  37.     } 
  38.   } 
  39.   //对边数组按权值排序 
  40.   public function sortArc() { 
  41.     $this->quicklySort(0, count($this->arc) - 1, $this->arc); 
  42.     return $this->arc; 
  43.   } 
  44.   //采用快排 
  45.   private function quicklySort($begin$end, &$item) { 
  46.     if ($begin < 0($begin >= $end)) return
  47.     $key = $this->excuteSort($begin$end$item); 
  48.     $this->quicklySort(0, $key - 1, $item); 
  49.     $this->quicklySort($key + 1, $end$item); 
  50.   } 
  51.   private function excuteSort($begin$end, &$item) { 
  52.     $key = $item[$begin]; 
  53.     $left = array(); 
  54.     $right = array(); 
  55.     for ($i = ($begin + 1); $i <= $end$i++) { 
  56.       if ($item[$i]->getWeight() <= $key->getWeight()) { 
  57.         $left[] = $item[$i]; 
  58.       } else { 
  59.         $right[] = $item[$i]; 
  60.       } 
  61.     } 
  62.     $return = $this->unio($left$right$key); 
  63.     $k = 0; 
  64.     for ($i = $begin$i <= $end$i++) { 
  65.       $item[$i] = $return[$k]; 
  66.       $k++; 
  67.     } 
  68.     return $begin + count($left); 
  69.   } 
  70.   private function unio($left$right$key) { 
  71.     return array_merge($leftarray
  72.       $key 
  73.     ) , $right); 
  74.   } 
  75.   //kruscal算法 
  76.   public function kruscal() { 
  77.     $this->krus = array(); 
  78.     $this->sortArc(); 
  79.     foreach ($this->vexs as $value) { 
  80.       $this->krus[$value] = "0"
  81.     } 
  82.     foreach ($this->arc as $key => $value) { 
  83.       $begin = $this->findRoot($value->getBegin()); 
  84.       $end = $this->findRoot($value->getEnd()); 
  85.       if ($begin != $end) { 
  86.         $this->krus[$begin] = $end
  87.         echo $value->getBegin() . "-" . $value->getEnd() . ":" . $value->getWeight() . "\n"
  88.       } 
  89.     } 
  90.   } 
  91.   //查找子树的尾结点 
  92.   private function findRoot($node) { 
  93.     while ($this->krus[$node] != "0") { 
  94.       $node = $this->krus[$node]; 
  95.     } 
  96.     return $node
  97.   } 
  98. ?>  

感兴趣的读者可以调试运行一下本文克鲁斯卡尔算法实例,相信会有新的收获。

Tags: PHP鲁斯卡尔算法

分享到: