收藏 分享(赏)

最小生成树matlab实现.docx

上传人:HR专家 文档编号:11670379 上传时间:2020-11-05 格式:DOCX 页数:5 大小:73.38KB
下载 相关 举报
最小生成树matlab实现.docx_第1页
第1页 / 共5页
最小生成树matlab实现.docx_第2页
第2页 / 共5页
最小生成树matlab实现.docx_第3页
第3页 / 共5页
最小生成树matlab实现.docx_第4页
第4页 / 共5页
最小生成树matlab实现.docx_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

1、primclear all;close all;Graph1;%调用 Graph1M 文件,产生图 1 的邻接矩阵%Graph2;%调用 Graph2M 文件,产生图 2 的邻接矩阵len=length(graph_adjacent);%求图中有多少个顶点k=sprintf(please input the point where you want to start ,do remember it must be between 1 and %d ,len);start_point=input(k);%输入最小生成树产生起点while(start_pointlen)%如果输入的结点位置不合法即

2、:小于等于零,或大于结点数,则重新输入disp(bad positon,please input again!); start_point=input(k);end;%*下面完成 prim 算法*%相关变量初始设置tree=zeros(len-1,2);%用于保存选入最小生成树的边lowcost=zeros(1,len);%用来保存集合 V-U 与集合 U 中顶点的最短边权值,lowcost v=0 表示顶点 v 已经%加入最小生成树中adjvex=zeros(1,len);%用来保存依附于该边在集合 U 中的节点,U 集合为生成最小生成树的辅助集合,%首先 U=start_point,之后依

3、次确定为把最小生成树的一边的另一节点加入 U%依次下去,直到图的全部顶点都在 U 中能找到lowcost=graph_adjacent(start_point,:);%lowcost(i)的值为节点 i 与 start_point 的权值;adjvex=start_point.*ones(1,len);%adjvex 中所有元素的值都为初始节点%以下循 n-1 次,用于找出最小生成树的 len-1 条边for i=1:len-1k=lowcost0;%k 为一逻辑数组,它和 lowcost 同维,对于每一个位置 i1lowcos t(i)0 则 k(i)=1%否则 k(i)=0;稍候将用这个数

4、组进行辅助寻址cost_min=min(lowcost(k);%找出 lowcost 中除 0 外的最小值index=find(lowcost=cost_min);%找出此最小值在 lowcost 中的下标,即找到相应的节点index=index(1);%因为最小值的下标可能不止一个,这里取第一个下标进行处理lowcost(index)=0;%表明该节点已经加入了最小生成树中 tree(i,:)=adjvex(index),index; %对 lowcost 和 adjvex 进行更新for j=1:lenif lowcost(j)graph_adjacent(j,index);lowcost

5、(j)=graph_adjacent(j,index);adjvex(j)=index;endendend;%*结果显示模块*s=0;for ii=1:len-1k=sprintf(最小生成树第%d 条边:(%d,%d),权值为%d,ii,tree(ii,1),tr ee(ii,2),graph_adjacent(tree(ii,1),tree(ii,2);%格式化字符串%disp(k);%显示%disp( );%空一行s=s+graph_adjacent(tree(ii,1),tree(ii,2);%求最小生成树的代价end%显示最小生成树的代价disp(最小生成树的总代价为:)disp(s

6、); kruskalclear all;close all;Graph11;%调用以邻接矩阵储存的图所在的 M 文件%Graph22;len=length(graph_adjacent);%计算图中的顶点数temp=graph_adjacent;%将原图内容拷贝到 temp 中,以防对原图做改动superedge=zeros(len-1,2);%用于保存生成最小生成树的边i=1;%指向 superedge 的下标for j=1:lentag(j)=j;%关联标志初始化,将每个顶点的关联标志设为其本身 end;%以下的循环完成 kruskal 算法while(superedge(len-1,1)

7、=0)Y,I=sort(temp);%将 temp 的每列按从小到大排序,数组 Y 保存 temp 排序后的结果,I 中保存相应结果对应的在 temp 中的下标cost_min=min(Y(1,:);%找出权值最小的边index=find(Y(1,:)=cost_min);%找出权值最小的边对应的顶点index=index(1);%一条边对应两个节点,且不同的边的权值可能一样,这里为了方便处理人为规定了顺序,取标号最小的顶点进行处理anotherpoint=I(1,index);%找到该边对应的另一个顶点%将该边对应的权值修改为最大,防止该边在下次循环中再次被选为最优边temp(index,a

8、notherpoint)=100;temp(anotherpoint,index)=100;if(tag(anotherpoint)=tag(index)%当两个点不属于一个连通集时,这两个点之间的边为最小生成树的边superedge(i,:)=index,anotherpoint;%将其加入最小生成树的边集中i=i+1;%下标加 1%下面的语句的作用是将两个连通分支变成一个连通分支,即 tag 值一样for j=1:len%以 index 的 tag 值为标准if(tag(j)=tag(anotherpoint)&(j=anotherpoint)%遍搜tag 数组,先将和 anotherpo

9、int tag 值一样的点的 tag 值变为 index 的 tag 值tag(j)=tag(index);endendtag(anotherpoint)=tag(index);%将 anotherpoint 的 tag 值变为 index 的 tag 值endend%*结果显示模块*s=0;for ii=1:len-1k=sprintf(最小生成树第%d 条边:(%d,%d),权值为%d,ii,superedge(ii, 1),superedge(ii,2),graph_adjacent(superedge(ii,1),superedge(ii, 2);%格式化字符串%disp(k);%显示%disp( );%空一行s=s+graph_adjacent(superedge(ii,1),superedge(ii,2);%求最小生成树的代价end%显示最小生成树的代价disp(最小生成树的总代价为:)disp(s);

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > 其他相关文档

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报