设为首页 收藏本站
查看: 507|回复: 0

[经验分享] PHP实现克鲁斯卡尔(kruscal)算法

[复制链接]

尚未签到

发表于 2017-4-8 08:17:03 | 显示全部楼层 |阅读模式
<?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());
?>

<?php
/**
* 边集数组
*
* @author zhaojiangwei
* @since 2011/11/4 16:09
*
*/
//边集数组的边类
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;
}
}

?>

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-361706-1-1.html 上篇帖子: PHP 反射机制详解 以及插件架构实现 下篇帖子: php.ini 的错误输出块的中文注解(转载)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表