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);