最小生成树(MATLAB)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

prim算法

设置两个集合P和Q,其中P 用于存放G的最小生成树中的顶点,集合Q存放G的最小生成树中的边。令集合P的初值为P={V1}(假设构造最小生成树时,从顶点V1出发),集合Q的初值为

。Prime算法的思想是,从所有p ∈P,v∈V-P的边中,选取具有最小权值的边pv,将顶点v加入集合P中,将边pv 加入集合Q中,如此不断重复,直到P=V时,最小生成树构造完毕,这时集合Q中包含了最小生成的所有边。(找最小的权,不连成圈即可)

•clc;clear;

•M=1000;

•a(1,2)=50; a(1,3)=60;

•a(2,4)=65; a(2,5)=40;

•a(3,4)=52;a(3,7)=45;

•a(4,5)=50; a(4,6)=30;a(4,7)=42;

•a(5,6)=70;

•a=[a;zeros(2,7)];

•a=a+a';a(find(a==0))=M;

•result=[];p=1;tb=2:length(a);

•while length(result)~=length(a)-1

•temp=a(p,tb);temp=temp(:);

•d=min(temp);

•[jb,kb]=find(a(p,tb)==d);

•j=p(jb(1));k=tb(kb(1));

•result=[result,[j;k;d]];p=[p,k];tb(find(tb==k))=[];

•end

•result

•例、一个乡有7个自然村,其间道路如图所示,要以村为中心建有线广播网络,如要求沿道路架设广播线,应如何架设?

Kruskal算法

每步从未选的边中选取边e,使它与已选边不构成圈,且e 是未选边中的最小权边,直到选够n-1条边为止。

•clc;clear;

•M=1000;

•a(1,2)=50; a(1,3)=60;

•a(2,4)=65; a(2,5)=40;

•a(3,4)=52;a(3,7)=45;

•a(4,5)=50; a(4,6)=30;a(4,7)=42;

•a(5,6)=70;

•[i,j]=find((a~=0)&(a~=M));

•b=a(find((a~=0)&(a~=M)));

•data=[i';j';b'];index=data(1:2,:);

•loop=max(size(a))-1;

•result=[];

•while length(result)

•temp=min(data(3,:));

•flag=find(data(3,:)==temp);

•flag=flag(1);

•v1=data(1,flag);v2=data(2,flag);

•if index(1,flag)~=index(2,flag)

•result=[result,data(:,flag)];

•end

•if v1>v2

•index(find(index==v1))=v2;

•else

•index(find(index==v2))=v1;

•end

•data(:,flag)=[];

•index(:,flag)=[];

•end

•result

中国邮递员问题

中国邮递员问题也可以表示为:在一个有奇点的连通图中。要求增加一些重复边,使得新的连通图不含有奇点,并且增加的重复边总权最小。

我们把增加重复边后不含奇点的新的连通图叫做邮递路线,而总权最小的邮递路线叫做最优邮递路线。

求图中所示的中国邮递员问题

•Fleury算法(在一个Euler图中找出Euler环游)

Fleury算法—算法步骤:

(1)任选一个顶点v0,令道路w0=v0

(2)假定道路w i=v0e1v1e2…e i v i已经选好,则从E\{e1,e2, …,e i}中选

一条边e i+1,使:

a)e i+1与v i相关联

b)除非不能选择,否则一定要使e i+1不是G i=G[E-{e1,e2, …,e i}]

的割边.

(3)第(2)步不能进行时就停止.

•注:包括三个文件;fleuf1.m, edf.m, flecvexf.m

•function [T c]=fleuf1(d)

•%注:必须保证是Euler环游,否则输出T=0,c=0

•n=length(d);

•b=d;

•b(b==inf)=0;

•b(b~=0)=1;

•m=0;

•a=sum(b);

•eds=sum(a)/2;

•ed=zeros(2,eds);

•vexs=zeros(1,eds+1);

•matr=b;

•for i=1:n

•if mod(a(i),2)==1

•m=m+1;

•end

•end

•if m~=0

•fprintf('there is not exit Euler path.\n')

•T=0;c=0;

•end

•if m==0

•vet=1;

•flag=0;

•t1=find(matr(vet,:)==1);

•for ii=1:length(t1)

•ed(:,1)=[vet,t1(ii)];

•vexs(1,1)=vet;vexs(1,2)=t1(ii);

相关文档
最新文档