PHP实现图的邻矩阵及普利姆算法(Prim)


  1. <?php 
  2.     require 'mGraph.php'; 
  3.     $a = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'); 
  4.     $b = array('ab'=>'10', 'af'=>'11', 'bg'=>'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');//键为边,值权值 
  5.       
  6.     $test = new MGraph($a, $b); 
  7.     print_r($test->prim()); 
  8. ?> 
  9. //mGraph.php 
  10. <?php 
  11.     class MGraph{ 
  12.         private $vexs; //顶点数组 
  13.         private $arc; //边邻接矩阵,即二维数组        
  14.         private $arcData; //边的数组信息 
  15.         private $direct; //图的类型(无向或有向) 
  16.         private $hasList; //尝试遍历时存储遍历过的结点 
  17.         private $queue; //广度优先遍历时存储孩子结点的队列,用数组模仿 
  18.         private $infinity = 65535;//代表无穷,即两点无连接,建带权值的图时用,本示例不带权值  
  19.         private $primVexs; //prim算法时保存顶点 
  20.         private $primArc; //prim算法时保存边 
  21.          
  22.         public function MGraph($vexs, $arc, $direct = 0){ 
  23.             $this->vexs = $vexs; 
  24.             $this->arcData = $arc; 
  25.             $this->direct = $direct; 
  26.             $this->initalizeArc(); 
  27.             $this->createArc();  
  28.         } 
  29.  
  30.         private function initalizeArc(){ 
  31.             foreach($this->vexs as $value){ 
  32.                 foreach($this->vexs as $cValue){ 
  33.                     $this->arc[$value][$cValue] = ($value == $cValue ? 0 : $this->infinity); 
  34.                 } 
  35.             } 
  36.         } 
  37.  
  38.         //创建图 $direct:0表示无向图,1表示有向图 
  39.         private function createArc(){ 
  40.             foreach($this->arcData as $key=>$value){ 
  41.                 $strArr = str_split($key); 
  42.                 $first = $strArr[0]; 
  43.                 $last = $strArr[1]; 
  44.                   
  45.                 $this->arc[$first][$last] = $value; 
  46.                 if(!$this->direct){ 
  47.                     $this->arc[$last][$first] = $value;  
  48.                 } 
  49.             } 
  50.         } 
  51.  
  52.         //prim算法,生成最小生成树 
  53.         public function prim(){ 
  54.             $this->primVexs = array(); 
  55.             $this->primArc = array($this->vexs[0]=>0); 
  56.              
  57.             for($i = 1; $i < count($this->vexs); $i ++){ 
  58.                 $this->primArc[$this->vexs[$i]] = $this->arc[$this->vexs[0]][$this->vexs[$i]]; 
  59.                 $this->primVexs[$this->vexs[$i]] = $this->vexs[0]; 
  60.             } 
  61.  
  62.             for($i = 0; $i < count($this->vexs); $i ++){ 
  63.                 $min = $this->infinity; 
  64.                 $key; 
  65.  
  66.                 foreach($this->vexs as $k=>$v){ 
  67.                     if($this->primArc[$v] != 0 && $this->primArc[$v] < $min){ 
  68.                         $key = $v; 
  69.                         $min = $this->primArc[$v]; 
  70.                     } 
  71.                 } 
  72.  
  73.                 $this->primArc[$key] = 0; 
  74.  
  75.                 foreach($this->arc[$key] as $k=>$v){ 
  76.                     if($this->primArc[$k] != 0 && $v < $this->primArc[$k]){ 
  77.                         $this->primArc[$k] = $v;   
  78.                         $this->primVexs[$k] = $key;  
  79.                     } 
  80.                 } 
  81.             } 
  82.  
  83.             return $this->primVexs; 
  84.         } 
  85.  
  86.         //一般算法,生成最小生成树 
  87.         public function bst(){ 
  88.             $this->primVexs = array($this->vexs[0]); 
  89.             $this->primArc = array(); 
  90.  
  91.             next($this->arc[key($this->arc)]);  
  92.             $key = NULL; 
  93.             $current = NULL; 
  94.  
  95.             while(count($this->primVexs) < count($this->vexs)){ 
  96.                 foreach($this->primVexs as $value){ 
  97.                     foreach($this->arc[$value] as $k=>$v){ 
  98.                         if(!in_array($k, $this->primVexs) && $v != 0 && $v != $this->infinity){ 
  99.                             if($key == NULL  $v < current($current)){ 
  100.                                 $key = $k; 
  101.                                 $current = array($value . $k=>$v); 
  102.                             } 
  103.                         } 
  104.  
  105.                     } 
  106.                 } 
  107.  
  108.                 $this->primVexs[] = $key; 
  109.                 $this->primArc[key($current)] = current($current); 
  110.                 $key = NULL; 
  111.                 $current = NULL; 
  112.             } 
  113.  
  114.             return array('vexs'=>$this->primVexs, 'arc'=>$this->primArc); 
  115.         } 
  116.  
  117.         //一般遍历 
  118.         public function reserve(){ 
  119.             $this->hasList = array(); 
  120.  
  121.             foreach($this->arc as $key=>$value){ 
  122.                 if(!in_array($key, $this->hasList)){ 
  123.                     $this->hasList[] = $key; 
  124.                 } 
  125.  
  126.                 foreach($value as $k=>$v){ 
  127.                     if($v == 1 && !in_array($k, $this->hasList)){ 
  128.                         $this->hasList[] = $k;    
  129.                     } 
  130.                 } 
  131.             } 
  132.  
  133.             foreach($this->vexs as $v){ 
  134.                 if(!in_array($v, $this->hasList)) 
  135.                     $this->hasList[] = $v; 
  136.             } 
  137.  
  138.             return implode($this->hasList); 
  139.         } 
  140.  
  141.         //广度优先遍历 
  142.         public function bfs(){ 
  143.             $this->hasList = array(); 
  144.             $this->queue = array(); 
  145.              
  146.             foreach($this->arc as $key=>$value){ 
  147.                 if(!in_array($key, $this->hasList)){ 
  148.                     $this->hasList[] = $key; 
  149.                     $this->queue[] = $value; 
  150.  
  151.                     while(!emptyempty($this->queue)){ 
  152.                         $child = array_shift($this->queue); 
  153.                          
  154.                         foreach($child as $k=>$v){ 
  155.                             if($v == 1 && !in_array($k, $this->hasList)){ 
  156.                                 $this->hasList[] = $k; 
  157.                                 $this->queue[] = $this->arc[$k];    
  158.                             } 
  159.                         } 
  160.                     } 
  161.                 } 
  162.             } 
  163.  
  164.             return implode($this->hasList); 
  165.               
  166.         } 
  167.  
  168.         //执行深度优先遍历 
  169.         public function excuteDfs($key){ 
  170.             $this->hasList[] = $key;   
  171.  
  172.             foreach($this->arc[$key] as $k=>$v){ 
  173.                 if($v == 1 && !in_array($k, $this->hasList)) 
  174.                     $this->excuteDfs($k);    
  175.             } 
  176.         } 
  177.  
  178.         //深度优先遍历 
  179.         public function dfs(){ 
  180.             $this->hasList = array(); 
  181.  
  182.             foreach($this->vexs as $key){ 
  183.                 if(!in_array($key, $this->hasList))  
  184.                     $this->excuteDfs($key);  
  185.             } 
  186.  
  187.             return implode($this->hasList); 
  188.         } 
  189.         //返回图的二维数组表示 
  190.         public function getArc(){ 
  191.             return $this->arc; 
  192.         } 
  193.         //返回结点个数 
  194.         public function getVexCount(){ 
  195.             return count($this->vexs); 
  196.         } 
  197.     } 
  198. ?> 

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php
, 算法
, 矩阵
, prims算法
, prim
Prim算法
普利姆算法、prim算法、最小生成树prim算法、prim算法求最小生成树、prim算法的时间复杂度,以便于您获取更多的相关知识。

时间: 2024-08-03 13:53:52

PHP实现图的邻矩阵及普利姆算法(Prim)的相关文章

普里姆算法介绍

普里姆(Prim)算法,和克鲁斯卡尔算法一样,是用来求加权连通图的最小生成树的算法. 基本思想 对于图G而言,V是所有顶点的集合:现在,设置两个新的集合U和T,其中U用于存放G的最小生成树中的顶点,T存放G的最小生成树中的边. 从所有uЄU,vЄ(V-U) (V-U表示出去U的所有顶点)的边中选取权值最小的边(u, v),将顶点v加入集合U中,将边(u, v)加入集合T中,如此不断重复,直到U=V为止,最小生成树构造完毕,这时集合T中包含了最小生成树中的所有边. 普里姆算法图解 以上图G4为例,

算法研究:图解最小生成树之普里姆算法

我们在图的定义中说过,带有权值的图就是网结构.一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶 点,但只有足以构成一棵树的n-1条边.所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接起来,并且使得权值 的和最小.综合以上两个概念,我们可以得出:构造连通网的最小代价生成树,即最小生成树(Minimum Cost Spanning Tree). 找连通图的最小生成树,经典的有两种算法,普里姆算法和克鲁斯卡尔算法,这里介绍克里姆算法. 为了能够讲明白这个算法,我们先构造网图的邻接矩

Prim(普里姆)算法求最小生成树的思想及C语言实例讲解_C 语言

Prim 算法思想:从任意一顶点 v0 开始选择其最近顶点 v1 构成树 T1,再连接与 T1 最近顶点 v2 构成树 T2, 如此重复直到所有顶点均在所构成树中为止. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以把边上的权值解释为线路的造价.则最小生成树表示使其造价最小的生成树. 构造网的最小生成树必须解决下面两个问题: 1.尽可能选取权值小的边,但不能构成回路: 2.选取n-1条恰当的边以连通n个顶点: MST性质:假设G=(V,

数据结构例程——最小生成树的普里姆算法

本文是[数据结构基础系列(7):图]中第11课时[最小生成树的普里姆算法]的例程. (程序中graph.h是图存储结构的"算法库"中的头文件,详情请单击链接-) #include <stdio.h> #include <malloc.h> #include "graph.h" void Prim(MGraph g,int v) { int lowcost[MAXV]; //顶点i是否在U中 int min; int closest[MAXV]

美新闻网站ProPublica普利策获奖作品(组图)

据<中国日报>报道,美国媒体4月13日消息,2010年美国普利策奖于当地时间12日在纽约哥伦比亚大学新闻学院揭晓,<华盛顿邮报>和<纽约时报>分获4项和3项大奖,不过今年评选最大的亮点是首次有网络媒体获得评委会的认可. 普利策奖自2009年开始允许网络作品参选,不过去年没有一家网络媒体获奖,而今年历史被改写.美国新闻网站ProPublica跟<纽约时报>杂志合作的一篇1.3万字的文章捧走了调查性报道奖. 董玮欢送会 2007年6月16日,伊恩的家人为他举行蛋

华尔街日报借数据揭秘美国医疗,获2015普利策...

华尔街日报借数据揭秘美国医疗,其报道斩获2015普利策 华尔街日报凭借"医疗揭秘"系列报道斩获2015年普利策新闻奖-调查写作.该系列报道向美国公众展示了以前医疗机构从未公布的信息数据:并利用数据披露了美医疗界存在的弊病和丑闻,其中包括最近公布的医院费用飞涨,医生受贿,医疗系统诈骗等热点新闻.关于该系列报道文摘工作者正在翻译整理,请见大数据文摘后续报道. 同时获得该奖项的还有纽约时报.该报记者埃里克.利普顿的关于华府游说集团对美国议会首脑及大法官的影响力的报道为纽约时报赢得了该奖项.

乔布斯承认错杀普利策奖得主iPhone应用程序

图为菲奥里漫画作品 北京时间4月17日下午消息,据国外媒体报道,苹果CEO史蒂夫·乔布斯(Steve Jobs)周五承认,苹果此前拒绝普利策奖得主.美国政治漫画家马克·菲奥里(Mark Fiore)的iPhone应用进驻苹果应用商店是个错误. 菲奥里本周刚刚凭借在<旧金山纪事报>网站上发表的漫画获得了普利策奖,成为有史以来第一个获此殊荣的网络漫画家.但在接受哈佛大学尼曼新闻实验室(Nieman Journalism Lab)采访时,菲奥里却透露,苹果去年12月拒绝了他的应用,原因是其中包含讽刺

网络媒体首获普利策奖

美国哥伦比亚大学12日宣布本年度普利策奖获奖名单.<华盛顿邮报>成最大赢家,独揽4项大奖.网络媒体首次捧得普利策奖. 普利策奖中分量最重的公共服务奖授予<布里斯托尔信使-先驱报>.这家位于弗吉尼亚州的地方媒体报道了弗吉尼亚在天然气特许权方面的混乱管理,最终促使州议会出台整改措施. 今年普利策奖的最大亮点之一是网络媒体首次获奖.非盈利新闻调查网站ProPublic与<纽约时报>周末副刊共享调查性报道奖.这篇报道描写新奥尔良市一家医院医护人员在卡特里娜飓风来袭期间的生死抉择

斯诺登揭露美政府监控报道获2014年普利策奖

美国情报机构前雇员斯诺登揭露美国政府实施大规模监控的有关新闻报道当地时间14日获得3721.html">2014年度普利策新闻奖. 美国<华盛顿邮报>和英国<卫报>根据"监控门"事件揭秘者斯诺登提供的大量机密文件所做的监控事件报道引发了各界的广泛关注,在美国社会引发了激烈讨论,并促使美国总统奥巴马做出限制政府监听权限的决定. 普利策奖评选委员会称,有关"监控门"的报道促使各界针对政府和公众在个人隐私和国家安全方面的关系展开辩论