最小生成树(MATLAB)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最小生成树(MATLAB)
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); •matr(vexs(1,2),vexs(1,1))=0; •flagg=1;tem=1; •while flagg •[flagg ed]=edf(matr,eds,vexs,ed,tem); •tem=tem+1; •if ed(1,eds)~=0 & ed(2,eds)~=0 •T=ed; •T(2,eds)=1; •c=0; •for g=1:eds • c=c+d(T(1,g),T(2,g)); •end •flagg=0; •break; •end •end