图论matlab模板程序Word下载.docx
《图论matlab模板程序Word下载.docx》由会员分享,可在线阅读,更多相关《图论matlab模板程序Word下载.docx(25页珍藏版)》请在冰豆网上搜索。
W(j,k)=-1;
%关联矩阵终点值为-1
%有向边的两个顶点
ifF(a
(1),i)==1
%有向边由a
(1)指向a
(2)
else
%有向边由a
(2)指向a
(1)
第二讲:
最短路问题
程序0:
最短距离矩阵
W表示图的权值矩阵
D表示图的最短距离矩阵
%连通图中各项顶点间最短距离的计算
functionD=shortdf(W)
%对于W(i,j),若两顶点间存在弧,则为弧的权值,否则为inf;
当i=j时W(i,j)=0
n=length(W);
D=W;
m=1;
whilem<
=n
fori=1:
forj=1:
ifD(i,j)>
D(i,m)+D(m,j)
D(i,j)+D(i,m)+D(m,j);
%距离进行更新
m=m+1;
D;
Dijkstra算法(计算两点间的最短路)
function[l,z]=Dijkstra(W)
n=size(W,1);
fori=1:
n
l(i)=W(1,i);
z(i)=0;
end
i=1;
whilei<
forj=1:
ifl(i)>
l(j)+W(j,i)
l(i)=l(j)+W(j,i);
z(i)=j-1;
ifj<
i
i=j-1;
i=i+1;
floyd算法(计算任意两点间的最短距离)
function[d,r]=floyd(a)
n=size(a,1);
d=a;
forj=1:
r(i,j)=j;
end
r;
fork=1:
ifd(i,k)+d(k,j)<
d(i,j)
d(i,j)=d(i,k)+d(k,j);
r(i,j)=r(i,k);
n2short.m计算指定两点间的最短距离
function[Pu]=n2short(W,k1,k2)
U=W;
ifU(i,j)>
U(i,m)+U(m,j)
U(i,j)=U(i,m)+U(m,j);
m=m+1;
u=U(k1,k2);
P1=zeros(1,n);
k=1;
P1(k)=k2;
V=ones(1,n)*inf;
kk=k2;
whilekk~=k1
V(1,i)=U(k1,kk)-W(i,kk);
ifV(1,i)==U(k1,i)
P1(k+1)=i;
kk=i;
wrow=find(P1~=0);
forj=length(wrow):
-1:
1
P(k)=P1(wrow(j));
程序四、n1short.m(计算某点到其它所有点的最短距离)
function[PmD]=n1short(W,k)
n=size(W,1);
D=zeros(1,n);
[Pd]=n2short(W,k,i);
Pm{i}=P;
D(i)=d;
程序五:
pass2short.m(计算经过某两点的最短距离)
function[Pd]=pass2short(W,k1,k2,t1,t2)
[p1d1]=n2short(W,k1,t1);
[p2d2]=n2short(W,t1,t2);
[p3d3]=n2short(W,t2,k2);
dt1=d1+d2+d3;
[p4d4]=n2short(W,k1,t2);
[p5d5]=n2short(W,t2,t1);
[p6d6]=n2short(W,t1,k2);
dt2=d4+d5+d6;
ifdt1<
dt2
d=dt1;
P=[p1p2(2:
length(p2))p3(2:
length(p3))];
else
p=[p4p5(2:
length(p5))p6(2:
length(p6))];
d;
第三讲:
最小生成树
最小生成树的Kruskal算法
function[Tc]=krusf(d,flag)
ifnargin==1
n=size(d,2);
m=sum(sum(d~=0))/2;
b=zeros(3,m);
forj=(i+1):
ifd(i,j)~=0
b(1,k)=i;
b(2,k)=j;
b(3,k)=d(i,j);
b=d;
n=max(max(b(1:
2,:
)));
m=size(b,2);
[B,i]=sortrows(b'
3);
B=B'
;
c=0;
T=[];
t=1:
n;
ift(B(1,i))~=t(B(2,i))
T(1:
2,k)=B(1:
2,i);
c=c+B(3,i);
tmin=min(t(B(1,i)),t(B(2,i)));
tmax=max(t(B(1,i)),t(B(2,i)));
ift(j)==tmax
t(j)=tmin;
ifk==n
break;
T;
c;
最小生成树的Prim算法
function[Tc]=Primf(a)
l=length(a);
a(a==0)=inf;
k=1:
l;
listV(k)=0;
listV
(1)=1;
e=1;
while(e<
l)
min=inf;
l
iflistV(i)==1
iflistV(j)==0&
min>
a(i,j)
min=a(i,j);
b=a(i,j);
s=i;
d=j;
listV(d)=1;
distance(e)=b;
source(e)=s;
destination(e)=d;
e=e+1;
T=[source;
destination];
forg=1:
e-1
c(g)=a(T(1,g),T(2,g));
第四讲:
Euler图和Hamilton图
Fleury算法(在一个Euler图中找出Euler环游)
注:
包括三个文件;
fleuf1.m,edf.m,flecvexf.m
function[Tc]=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;
ifmod(a(i),2)==1
ifm~=0
fprintf('
thereisnotexitEulerpath.\n'
)
T=0;
c=0;
ifm==0
vet=1;
flag=0;
t1=find(matr(vet,:
)==1);
forii=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;
whileflagg
[flagged]=edf(matr,eds,vexs,ed,tem);
tem=tem+1;
ifed(1,eds)~=0&
ed(2,eds)~=0
T=ed;
T(2,eds)=1;
forg=1:
eds
c=c+d(T(1,g),T(2,g));
flagg=0;
function[flaged]=edf(matr,eds,vexs,ed,tem)
flag=1;
[dvexf]=flecvexf(matr,i,vexs,eds,ed,tem);
iff==1
ifdvex~=0
i)=[vexs(1,i)dvex];
vexs(1,i+1)=dvex;
matr(vexs(1,i+1),vexs(1,i))=0;
else
function[dvexf]=flecvexf(matr,i,vexs,eds,ed,temp)
f=0;
edd=find(matr(vexs(1,i),:
dvex=0;
dvex1=[];
ded=[];
iflength(edd)==1
dvex=edd;
dd=1;
dd1=0;
kkk=0;
forkk=1:
length(edd)
m1=find(vexs==edd(kk));
ifsum(m1)==0
dvex1(dd)=edd(kk);
dd=dd+1;
dd1=1;
kkk=kkk+1;
ifkkk==length(edd)
tem=vexs(1,i)*ones(1,kkk);
edd1=[tem;
edd];
forl1=1:
kkk
lt=0;
ddd=1;
forl2=1:
ifedd1(1:
2,l1)==ed(1:
2,l2)
lt=lt+1;
iflt==0
ded(ddd)=edd(l1);
ddd=ddd+1;
iftemp<
=length(dvex1)
dvex=dvex1(temp);
elseiftemp>
length(dvex1)&
temp<
=length(ded)
dvex=ded(temp);
f=1;
Hamilton改良圈算法(找出比较好的Hamilton路)
function[Cd1]=hamiltonglf(v)
%d表示权值矩阵
%C表示算法最终找到的Hamilton圈。
%v=[5167;
3784;
4194;
299;
1854;
450;
2442;
2538;
1340;
764;
2260;
2562;
1840;
4126];
n=size(v,1);
subplot(1,2,1)
holdon;
plot(v(:
1),v(:
2),'
*'
%描点
str1='
V'
str2=num2str(i);
dot=[str1,str2];
text(v(i,1)-1,v(i,2)-2,dot);
%给点命名
2));
%连线
plot([v(n,1),v(1,1)],[v(n,2),v(1,2)]);
fori=1:
d(i,j)=sqrt((v(i,1)-v(j,1))^2+(v(i,2)-v(j,2))^2);
d2=0;
ifi<
d2=d2+d(i,i+1);
d2=d2+d(n,1);
text(10,30,num2str(d2));
n=size(d,2);
C=[linspace(1,n,n)1];
fornnn=1:
20
C1=C;
ifn>
3
form=4:
n+1
(m-3)
forj=(i+2):
(m-1)
if(d(C(i),C(j))+d(C(i+1),C(j+1))<
d(C(i),C(i+1))+d(C(j),C(j+1)))
C1(1:
i)=C(1:
i);
fork=(i+1):
j
C1(k)=C(j+i+1-k);
C1((j+1):
m)=C((j+1):
m);
elseifn<
=3
ifn<
=2
ItdoesnotexistHamiltoncircle.'
Anycirlceistherightanswer.'
C=C1;
d1=0;
d1=d1+d(C(i),C(i+1));
d1;
subplot(1,2,2);
v2=[v;
v(1,1),v(1,2)];
plot(v(C(:
),1),v(C(:
),2),'
r'
text(10,30,num2str(d1));
第五讲:
匹配问题及算法
较大基础匹配算法
functionJ=matgraf(W)
J=zeros(n,n);
whilesum(sum(W))~=0
a=find(W~=0);
t1=mod(a
(1),n);
ift1==0
t1=n;
ifa
(1)/n>
floor(a
(1)/n)
t2=floor(a
(1)/n)+1;
t2=floor(a
(1)/n);
J(t1,t2)=1,J(t2,t1)=1;
W(t1,:
)=0;
W(t2,:
W(:
t1)=0;
W(:
t2)=0;
J;
匈牙利算法(完美匹配算法,包括三个文件fc01,fc02,fc03)
function[e,s]=fc01(a,flag)
b=a;
ifflag==0
cmax=max(max(b)'
b=cmax-b;
m=size(b);
m
(1)
b(i,:
)=b(i,:
)-min(b(i,:
));
m
(2)
b(:
j)=b(:
j)-min(b(:
j));
d=(b==0);
[e,total]=fc02(d);
whiletotal~=m
(1)
b=fc03(b,e);
d=(b==0);
[e,total]=fc02(d);
inx=sub2ind(size(a),e(:
1),e(:
e=[e,a(inx)];
s=sum(a(inx));
function[e,total]=fc02(d)
total=0;
m=size(d);
e=zeros(m
(1),2);
t=sum(sum(d)'
nump=sum(d'
whilet~=0
[s,inp]=sort(nump);
inq=find(s);
ep=inp(inq
(1));
inp=find(d(ep,:
numq=sum(d(:
inp));
[s,inq]=sort(numq);
eq=inp(inq
(1));
total=total+1;
e(total,:
)=[ep,eq];
inp=find(d(:
eq));
nump(inp)=nump(inp)-1;
nump(ep)=0;
t=t-sum(d(ep,:
))-sum(d(:
eq))+1;
d(ep,:
)=0*d(ep,:
d(:
eq)=0*d(:
eq);
functionb=fc03(b,e)
t=1;
p=ones(m
(1),1);
q=zeros(m
(1),1);
inp=find(e(:
1)~=0);
p(e(inp,1))=0;
tp=sum(p+q);
inp=find(p==1);
n=size(inp);
n
(1)
inq=find(b(inp(i),:
)==0);
q(inq)=1;
inp=find(q==1);
ifall(e(:
2)-inp(i))==0
inq=find((e(:
2)-inp(i))==0);
p(e(inq))=1;
tq=sum(p+q);
t=tq-tp;
inp=find(p==1);
inq=find(q==0);
cmin=min(min(b(inp,inq))'
inq=find(q==1);
b(inp,:
)=b(inp,:
)-cmin;
b(:
inq)=b(:
inq)+cmin;
第六讲:
最大流最小费用问题
2F算法(Ford-Fulkerson算法),求最大流
%C=[05430000;
00005300;
00000320;
00000020;
%00000004;
00000003;
00000005;
00000000]
function[fwf]=fulkersonf(C,f1)
%C表示容量
%f1表示当前流量,默认为0
%f表示最大流±
í
Ê
¾
×
î
´
ó
Á
÷
%wf表示最大流的流量
n=length(C);
ifnargin==1;
f=zeros(n,n);
f=f1;
No=zeros(1,n);
d=zeros(1,n);
while
(1)
No
(1)=n+1;
d
(1)=Inf;
while
(1)
pd=1;
for(i=1:
n)
if(No(i))
for(j=1:
if(No(j)==0&
f(i,j)<
C(i,j))
No(j)=i;
d(j)=C(i,j)-f(i,j);
pd=0;
if(d(j)>
d(i))
d(j)=d(i);
elseif(No(j)==0&
f(j,i)>
0)
No(j)=-i;
d(j)=f(j,i);
if(No(n)|pd)
if(pd)
dvt=d(n);
t=n;
if(No(t)>
f(No(t),t)=f(No(t),t)+dvt;
elseif(No(t)<
f(No(t),t)=f(No(t),t)-dvt;
if(No(t)==1)
No(i)=0;
d(i)=0;
break
t=No(t);
wf=0;
for(j=1:
wf=wf+f(1,j);
e