简介Kruskal算法是一种用于求最小生成树的算法,由JosephKruskal于1956年发表。Prim的算法和Boruvka的算法也被用来解决同样的问题。三种算法都是贪心算法的应用。与Boruvka的算法不同,Kruskal的算法在图中存在相同权重的边时也有效。应用场景公交站牌问题和道路施工问题的概念,首先构造一个只包含n个顶点和一个空边集的子图,并将子图中的每个顶点作为每棵树的根节点,然后,从网络中选择一个边集合E中权值最小的边,如果这条边的两个顶点属于不同的树,则把它加入到子图中,即把两棵树合为一棵树,否则,如果这条边的两个顶点有已经落在同一棵树上,这是不可取的,但应该取权重最小的边再试一次。以此类推,直到森林中只有一棵树,即子图包含n-1条边。[1]图解步骤是先对数据进行排序,将权重最小的放入结果集中,依次处理。最重要的是不要有闭环,避免闭环。)每次需要在最小生成树中加入一条边时,判断这条边是否与两个顶点重叠。如果有重叠,则形成循环代码实现classKruskal{/***边数**@varinteger*/private$edgeNum=0;/***顶点数组**@vararray*/private$vertexs=[];/***邻接矩阵**@vararray*/private$matrix=[];publicstaticfunctionfactory(){//0123456$vertexs=["A","B","C","D","E","F","G"];$matrix=[//ABCDEFG[0,12,-1,-1,-1,16,14],//A[12,0,10,-1,-1,7,-1],//B[-1,10,0,3,5,6,-1],//C[-1,-1,3,0,4,-1,-1],//D[-1,-1,5,4,0,2,8],//E[16,7,6,-1,2,0,9],//F[14,-1,-1,-1,8,9,0]//G];$rs=newKruskal($vertexs,$matrix);}公共函数__construct($vertexs,$matrix){$vlen=count($vertexs);$this->vertexs=$vertexs;$this->matrix=$matrix;//统计边的条数for($i=0;$i<$vlen;$i++){for($j=$i+1;$j<$vlen;$j++){if($this->矩阵[$i][$j]!=-1){$this->edgeNum++;}}}$this->kruskal1();}publicfunctionkruskal1(){$index=0;$ends=array_fill(0,$this->edgeNum,0);$rets=[];$edges=$this->getEdges();$排序=[];foreach($edgesas$val){$sort[]=$val->weight;}array_multisort($sort,SORT_ASC,$edges);for($i=0;$i<$this->edgeNum;$i++){$p1=$this->getPosition($edges[$i]->start);}$p2=$this->getPosition($edges[$i]->end);$m=$this->getEnd($ends,$p1);$n=$this->getEnd($ends,$p2);如果($m!=$n){$ends[$m]=$n;$rets[$index++]=$edges[$i];}}foreach($retsas$val){echosprintf("%s->%s=%s",$val->start,$val->end,$val->weight);}回声“\n”;}公共函数getEdges(){$index=0;$边=[];for($i=0;$i
