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


Posted in PHP onAugust 22, 2014

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

具体代码如下:

<?php
require 'edge.php';
$a = array(
  'a',
  'b',
  'c',
  'd',
  'e',
  'f',
  'g',
  'h',
  'i'
);
$b = array(
  'ab' => '10',
  'af' => '11',
  'gb' => '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 Edge($a, $b);
print_r($test->kruscal());
?>

edge.php文件代码如下:

<?php
//边集数组的边类
class EdgeArc {
  private $begin; //起始点
  private $end; //结束点
  private $weight; //权值
  public function EdgeArc($begin, $end, $weight) {
    $this->begin = $begin;
    $this->end = $end;
    $this->weight = $weight;
  }
  public function getBegin() {
    return $this->begin;
  }
  public function getEnd() {
    return $this->end;
  }
  public function getWeight() {
    return $this->weight;
  }
}
class Edge {
  //边集数组实现图
  private $vexs; //顶点集合
  private $arc; //边集合
  private $arcData; //要构建图的边信息
  private $krus; //kruscal算法时存放森林信息
  public function Edge($vexsData, $arcData) {
    $this->vexs = $vexsData;
    $this->arcData = $arcData;
    $this->createArc();
  }
  //创建边
  private function createArc() {
    foreach ($this->arcData as $key => $value) {
      $key = str_split($key);
      $this->arc[] = new EdgeArc($key[0], $key[1], $value);
    }
  }
  //对边数组按权值排序
  public function sortArc() {
    $this->quicklySort(0, count($this->arc) - 1, $this->arc);
    return $this->arc;
  }
  //采用快排
  private function quicklySort($begin, $end, &$item) {
    if ($begin < 0($begin >= $end)) return;
    $key = $this->excuteSort($begin, $end, $item);
    $this->quicklySort(0, $key - 1, $item);
    $this->quicklySort($key + 1, $end, $item);
  }
  private function excuteSort($begin, $end, &$item) {
    $key = $item[$begin];
    $left = array();
    $right = array();
    for ($i = ($begin + 1); $i <= $end; $i++) {
      if ($item[$i]->getWeight() <= $key->getWeight()) {
        $left[] = $item[$i];
      } else {
        $right[] = $item[$i];
      }
    }
    $return = $this->unio($left, $right, $key);
    $k = 0;
    for ($i = $begin; $i <= $end; $i++) {
      $item[$i] = $return[$k];
      $k++;
    }
    return $begin + count($left);
  }
  private function unio($left, $right, $key) {
    return array_merge($left, array(
      $key
    ) , $right);
  }
  //kruscal算法
  public function kruscal() {
    $this->krus = array();
    $this->sortArc();
    foreach ($this->vexs as $value) {
      $this->krus[$value] = "0";
    }
    foreach ($this->arc as $key => $value) {
      $begin = $this->findRoot($value->getBegin());
      $end = $this->findRoot($value->getEnd());
      if ($begin != $end) {
        $this->krus[$begin] = $end;
        echo $value->getBegin() . "-" . $value->getEnd() . ":" . $value->getWeight() . "\n";
      }
    }
  }
  //查找子树的尾结点
  private function findRoot($node) {
    while ($this->krus[$node] != "0") {
      $node = $this->krus[$node];
    }
    return $node;
  }
}
?>

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

PHP 相关文章推荐
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
Nov 18 PHP
实现dedecms全站URL静态化改造的代码
Mar 29 PHP
PHP 配置文件中open_basedir选项作用
Jul 19 PHP
一些被忽视的PHP函数(简单整理)
Apr 30 PHP
PHP读取ACCESS数据到MYSQL的代码
May 11 PHP
php curl常见错误:SSL错误、bool(false)
Dec 28 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
Feb 04 PHP
PHP实现多进程并行操作的详解(可做守护进程)
Jun 18 PHP
php中创建和调用webservice接口示例
Jul 25 PHP
PHP中each与list用法分析
Jan 08 PHP
php实现的中秋博饼游戏之绘制骰子图案功能示例
Nov 06 PHP
常见的5个PHP编码小陋习以及优化实例讲解
Feb 27 PHP
php中限制ip段访问、禁止ip提交表单的代码分享
Aug 22 #PHP
destoon出现验证码不显示时的紧急处理方法
Aug 22 #PHP
PHP中new static()与new self()的区别异同分析
Aug 22 #PHP
PHP中的替代语法简介
Aug 22 #PHP
destoon供应信息title调用出公司名称的方法
Aug 22 #PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
Aug 22 #PHP
destoon文章模块调用企业会员资料的方法
Aug 22 #PHP
You might like
多文件上载系统完整版
2006/10/09 PHP
PHP中冒号、endif、endwhile、endfor使用介绍
2010/04/28 PHP
php中preg_replace正则替换用法分析【一次替换多个值】
2017/01/17 PHP
PHP实现限制IP访问及提交次数的方法详解
2017/07/17 PHP
总结PHP内存释放以及垃圾回收
2018/03/29 PHP
laravel 解决groupBy时出现的错误 isn't in Group By问题
2019/10/17 PHP
PHP7 字符串处理机制修改
2021/03/09 PHP
JavaScript 节点操作 以及DOMDocument属性和方法
2007/12/06 Javascript
jquery 操作单选框,复选框,下拉列表实现代码
2009/10/27 Javascript
JS在textarea光标处插入文本的小例子
2013/03/22 Javascript
js导入导出excel(实例代码)
2013/11/25 Javascript
wap手机图片滑动切换特效无css3元素js脚本编写
2014/07/28 Javascript
直接拿来用的15个jQuery代码片段
2015/09/23 Javascript
JavaScript数组方法总结分析
2016/05/06 Javascript
利用JS轻松实现获取表单数据
2016/12/06 Javascript
jquery点赞功能实现代码 点个赞吧!
2020/05/29 jQuery
JS中把函数作为另一函数的参数传递方法(总结)
2017/06/28 Javascript
vue一步步实现alert功能
2017/07/05 Javascript
JavaScript+CSS相册特效实例代码
2017/09/07 Javascript
JS返回顶部实例代码
2020/08/09 Javascript
基于Vue 服务端Cookies删除的问题
2018/09/21 Javascript
JS事件绑定的常用方式实例总结
2019/03/02 Javascript
Vue项目引发的「过滤器」使用教程
2019/03/12 Javascript
JavaScript页面加载事件实例讲解
2019/09/01 Javascript
浅谈vue中使用编辑器vue-quill-editor踩过的坑
2020/08/03 Javascript
Python中字符串的修改及传参详解
2016/11/30 Python
matplotlib savefig 保存图片大小的实例
2018/05/24 Python
django ajax json的实例代码
2018/05/29 Python
tensorflow 加载部分变量的实例讲解
2018/07/27 Python
在python中画正态分布图像的实例
2019/07/08 Python
使用html2canvas实现浏览器截图的示例代码
2018/01/26 HTML / CSS
德国童装购物网站:NICKI´S.com
2018/04/20 全球购物
香蕉共和国加拿大官网:Banana Republic加拿大
2018/08/06 全球购物
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
电子信息科学专业自荐信
2014/01/30 职场文书
运动会演讲稿
2014/05/07 职场文书