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 相关文章推荐
php mysql数据库操作分页类
Jun 04 PHP
PHP读取文件内容后清空文件示例代码
Mar 18 PHP
php socket实现的聊天室代码分享
Aug 16 PHP
使用php的HTTP请求的库Requests实现美女图片墙
Feb 22 PHP
PHP5多态性与动态绑定介绍
Apr 03 PHP
PHP+MySQL之Insert Into数据插入用法分析
Sep 27 PHP
必须收藏的php实用代码片段
Feb 02 PHP
php轻松实现文件上传功能
Mar 03 PHP
利用php抓取蜘蛛爬虫痕迹的示例代码
Sep 30 PHP
PHP下载远程图片的几种方法总结
Apr 07 PHP
PHP+Session防止表单重复提交的解决方法
Apr 09 PHP
laravel高级的Join语法详解以及使用Join多个条件
Oct 16 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常用技巧总结(附函数代码)
2012/02/04 PHP
PHP获取数组的键与值方法小结
2015/06/13 PHP
JavaScript.The.Good.Parts阅读笔记(一)假值与===运算符
2010/11/16 Javascript
Javascript学习笔记-详解in运算符
2011/09/13 Javascript
Jqgrid表格随窗口大小改变而改变的简单实例
2013/12/28 Javascript
基于编写jQuery的无缝滚动插件
2014/08/02 Javascript
javascript框架设计之类工厂
2015/06/23 Javascript
分享经典的JavaScript开发技巧
2015/11/21 Javascript
Bootstrap和Java分页实例第一篇
2016/12/23 Javascript
javascript实现用户点击数量统计
2016/12/25 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
2017/01/05 Javascript
nodejs获取微信小程序带参数二维码实现代码
2017/04/12 NodeJs
详解Vue2.0 事件派发与接收
2017/09/05 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
2018/09/04 Javascript
JS监听事件的叠加和移除功能
2018/11/19 Javascript
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
2019/01/18 jQuery
防止Layui form表单重复提交的实现方法
2019/09/10 Javascript
通过实例了解JS执行上下文运行原理
2020/06/17 Javascript
vue中渲染对象中属性时显示未定义的解决
2020/07/31 Javascript
如何构建一个Vue插件并生成npm包
2020/10/26 Javascript
如何正确解决VuePress本地访问出现资源报错404的问题
2020/12/03 Vue.js
[08:29]DOTA2每周TOP10 精彩击杀集锦vol.7
2014/06/25 DOTA
跟老齐学Python之Python安装
2014/09/12 Python
Python计时相关操作详解【time,datetime】
2017/05/26 Python
tensorflow之自定义神经网络层实例
2020/02/07 Python
Python正则表达式高级使用方法汇总
2020/06/18 Python
Chantelle仙黛尔内衣美国官网:法国第一品牌内衣
2018/07/26 全球购物
倩碧英国官网:Clinique英国
2018/08/10 全球购物
PHP如何删除一个Cookie值
2012/11/15 面试题
财务主管自我鉴定
2014/01/17 职场文书
2014年国庆晚会主持词
2014/09/19 职场文书
合作合同协议书范本
2015/01/27 职场文书
本科毕业论文致谢词
2015/05/14 职场文书
小兵张嘎电影观后感
2015/06/03 职场文书
一个独生女的故事观后感
2015/06/04 职场文书
Python如何利用正则表达式爬取网页信息及图片
2021/04/17 Python