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 相关文章推荐
层叠菜单的动态生成
Oct 09 PHP
php自动注册登录验证机制实现代码
Dec 20 PHP
PHP Curl出现403错误的解决办法
May 29 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
Aug 15 PHP
php编写批量生成不重复的卡号密码代码
May 14 PHP
基于php的CMS中展示文章类实例分析
Jun 18 PHP
8个PHP数组面试题
Jun 23 PHP
PHP获取当前相对于域名目录的方法
Jun 26 PHP
php目录拷贝实现方法
Jul 10 PHP
Yii 2中的load()和save()示例详解
Aug 03 PHP
实例介绍PHP中zip_open()函数用法
Feb 15 PHP
Yii框架学习笔记之session与cookie简单操作示例
Apr 30 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
PHP基于curl post实现发送url及相关中文乱码问题解决方法
2017/11/25 PHP
使用PHP开发留言板功能
2019/11/19 PHP
javascript 构造函数强制调用经验总结
2012/12/02 Javascript
用jquery实现点击栏目背景色改变
2012/12/10 Javascript
Jquery注册事件实现方法
2015/05/18 Javascript
详解Node.js中exports和module.exports的区别
2017/04/19 Javascript
简述Angular 5 快速入门
2017/11/04 Javascript
详解vue 数组和对象渲染问题
2018/09/21 Javascript
tracking.js页面人脸识别插件使用方法
2020/04/16 Javascript
layui禁用侧边导航栏点击事件的解决方法
2019/09/25 Javascript
antd 表格列宽自适应方法以及错误处理操作
2020/10/27 Javascript
[56:20]LGD vs VP Supermajor 败者组决赛 BO3 第三场 6.10
2018/07/04 DOTA
[45:59]EG vs OG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[54:09]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
使用Python设置tmpfs来加速项目的教程
2015/04/17 Python
用Python的Flask框架结合MySQL写一个内存监控程序
2015/11/07 Python
Python内置模块logging用法实例分析
2018/02/12 Python
使用python编写udp协议的ping程序方法
2018/04/22 Python
python下解压缩zip文件并删除文件的实例
2018/04/24 Python
flask session组件的使用示例
2018/12/25 Python
Python imread、newaxis用法详解
2019/11/04 Python
python实现跨excel sheet复制代码实例
2020/03/03 Python
Python如何避免文件同名产生覆盖
2020/06/09 Python
如何Tkinter模块编写Python图形界面
2020/10/14 Python
python解包概念及实例
2021/02/17 Python
详解CSS透明opacity和IE各版本透明度滤镜filter的最准确用法
2016/12/20 HTML / CSS
教师自我鉴定范文
2013/11/10 职场文书
企划专员岗位职责
2013/12/09 职场文书
上党课的心得体会
2014/09/02 职场文书
中学生思想品德评语
2014/12/31 职场文书
英语教师求职信范文
2015/03/20 职场文书
2015年财政所工作总结
2015/04/25 职场文书
社区法制宣传月活动总结
2015/05/07 职场文书
刑事附带民事起诉状
2015/05/19 职场文书
2016年中学法制宣传日活动总结
2016/04/01 职场文书
工作一年自我鉴定
2019/06/20 职场文书