matlab图论程序算法大全Word文档下载推荐.docx
《matlab图论程序算法大全Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《matlab图论程序算法大全Word文档下载推荐.docx(39页珍藏版)》请在冰豆网上搜索。
![matlab图论程序算法大全Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2023-2/3/dbced33d-d885-436a-9a46-863e959c5f77/dbced33d-d885-436a-9a46-863e959c5f771.gif)
if(a(s(t),t)>
0)dvtt=C(s(t),t)-f(s(t),t);
%前向弧调整量
elseif(a(s(t),t)<
0)dvtt=f(t,s(t));
end%后向弧调整量
if(dvt>
dvtt)dvt=dvtt;
if(s(t)==1)break;
end%当t的标号为vs时,终止计算调整量
t=s(t);
end%继续调整前一段弧上的流f
if(wf+dvt>
=wf0)dvt=wf0-wf;
pd=1;
end%如果最大流量大于或等于预定的流量值
while
(1)%调整过程
0)f(s(t),t)=f(s(t),t)+dvt;
%前向弧调整
0)f(t,s(t))=f(t,s(t))-dvt;
end%后向弧调整
end%当t的标号为vs时,终止调整过程
end%如果最大流量达到预定的流量值
for(j=1:
n)wf=wf+f(1,j);
end%计算最大流量
zwf=0;
n)zwf=zwf+b(i,j)*f(i,j);
end%计算最小费用
f%显示最小费用最大流
图6-22
wf%显示最小费用最大流量
zwf%显示最小费用,程序结束__
Kruskal避圈法:
Kruskal避圈法的MATLAB程序代码如下:
n=8;
A=[02810000
20601000
86075120
10700090
01500308
00103046
00290403
00008630];
k=1;
%记录A中不同正数的个数
n-1)for(j=i+1:
n)%此循环是查找A中所有不同的正数
if(A(i,j)>
0)x(k)=A(i,j);
%数组x记录A中不同的正数
kk=1;
%临时变量
for(s=1:
k-1)if(x(k)==x(s))kk=0;
break;
end%排除相同的正数
k=k+kk;
k=k-1%显示A中所有不同正数的个数
k-1)for(j=i+1:
k)%将x中不同的正数从小到大排序
if(x(j)<
x(i))xx=x(j);
x(j)=x(i);
x(i)=xx;
T(n,n)=0;
%将矩阵T中所有的元素赋值为0
q=0;
%记录加入到树T中的边数
k)if(q==n)break;
end%获得最小生成树T,算法终止
n)if(A(i,j)==x(s))T(i,j)=x(s);
T(j,i)=x(s);
%加入边到树T中
TT=T;
%临时记录T
while
(1)pd=1;
%砍掉TT中所有的树枝
for(y=1:
n)kk=0;
for(z=1:
n)if(TT(y,z)>
0)kk=kk+1;
zz=z;
end%寻找TT中的树枝
if(kk==1)TT(y,zz)=0;
TT(zz,y)=0;
end%砍掉TT中的树枝
end%已砍掉了TT中所有的树枝
%判断TT中是否有圈
n-1)for(z=y+1:
0)pd=1;
if(pd)T(i,j)=0;
T(j,i)=0;
%假如TT中有圈
elseq=q+1;
T%显示近似最小生成树T,程序结束
用Warshall-Floyd算法求任意两点间的最短路.
A=[0281InfInfInfInf
206Inf1InfInfInf
8607512Inf
1Inf70InfInf9Inf
Inf15Inf03Inf8
InfInf1Inf3046
InfInf29Inf403
InfInfInfInf8630];
%MATLAB中,Inf表示∞
D=A;
%赋初值
n)R(i,j)=j;
end%赋路径初值
n)for(i=1:
n)if(D(i,k)+D(k,j)<
D(i,j))D(i,j)=D(i,k)+D(k,j);
%更新dij
R(i,j)=k;
end%更新rij
k%显示迭代步数
D%显示每步迭代后的路长
R%显示每步迭代后的路径
fori=1:
n%含有负权时
if(D(i,i)<
end%存在一条含有顶点vi的负回路
end%存在一条负回路,终止程序
end%程序结束
利用Ford--Fulkerson标号法求最大流算法的MATLAB程序代码如下:
C=[05430000
00005300
00000320
00000020
00000004
00000003
00000005
00000000];
n)No(i)=0;
d(i)=0;
end%No,d记录标号
图6-19
No
(1)=n+1;
d
(1)=Inf;
%给发点vs标号
%标号过程
n)if(No(i))%选择一个已标号的点vi
for(j=1:
n)if(No(j)==0&
f(i,j)<
C(i,j))%对于未给标号的点vj,当vivj为非饱和弧时
No(j)=i;
d(j)=C(i,j)-f(i,j);
if(d(j)>
d(i))d(j)=d(i);
elseif(No(j)==0&
f(j,i)>
0)%对于未给标号的点vj,当vjvi为非零流弧时
No(j)=-i;
d(j)=f(j,i);
if(No(n)|pd)break;
end%若收点vt得到标号或者无法标号,终止标号过程
end%vt未得到标号,f已是最大流,算法终止
dvt=d(n);
if(No(t)>
0)f(No(t),t)=f(No(t),t)+dvt;
elseif(No(t)<
0)f(No(t),t)=f(No(t),t)-dvt;
if(No(t)==1)for(i=1:
end;
t=No(t);
%继续调整前一段弧上的流f
f%显示最大流
wf%显示最大流量
No%显示标号,由此可得最小割,程序结束
图论程序大全
程序一:
关联矩阵和邻接矩阵互换算法
functionW=incandadf(F,f)
iff==0
m=sum(sum(F))/2;
n=size(F,1);
W=zeros(n,m);
k=1;
fori=1:
n
forj=i:
ifF(i,j)~=0
W(i,k)=1;
W(j,k)=1;
k=k+1;
end
elseiff==1
m=size(F,2);
W=zeros(n,n);
m
a=find(F(:
i)~=0);
W(a
(1),a
(2))=1;
W(a
(2),a
(1))=1;
else
fprint('
Pleaseimputtherightvalueoff'
);
W;
程序二:
可达矩阵算法
functionP=dgraf(A)
n=size(A,1);
P=A;
fori=2:
P=P+A^i;
P(P~=0)=1;
P;
程序三:
有向图关联矩阵和邻接矩阵互换算法
functionW=mattransf(F,f)
m=sum(sum(F));
W(j,k)=-1;
ifF(a
(1),i)==1
else
第二讲:
最短路问题
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<
=n
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);
计算指定两点间的最短距离
function[Pu]=n2short(W,k1,k2)
n=length(W);
U=W;
m=1;
whilem<
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);
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));
程序四、(计算某点到其它所有点的最短距离)
function[PmD]=n1short(W,k)
n=size(W,1);
D=zeros(1,n);
[Pd]=n2short(W,k,i);
Pm{i}=P;
D(i)=d;
程序五:
(计算经过某两点的最短距离)
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));
另外两种程序
最小生成树程序1(prim算法构造最小生成树)
a=[inf5060infinfinfinf;
50infinf6540infinf;
60infinf52infinf45;
...
inf6552inf503042;
inf40inf50inf70inf;
infinfinf3070infinf;
infinf4542infinfinf];
result=[];
p=1;
tb=2:
length(a);
whilelength(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))=[];
result
最小生成树程序2(Kruskal算法构造最小生成树)
clc;
clear;
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,b]=find(a);
data=[i'
j'
b'
];
index=data(1:
loop=max(size(a))-1;
whilelength(result)<
loop
temp=min(data(3,:
));
flag=find(data(3,:
)==temp);
flag=flag
(1);
v1=data(1,flag);
v2=data(2,flag);
ifindex(1,flag)~=index(2,flag)
result=[result,data(:
flag)];
index(find(index==v2))=v1;
data(:
flag)=[];
index(:
第四讲:
Euler图和Hamilton图
Fleury算法(在一个Euler图中找出Euler环游)
注:
包括三个文件;
,
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;
fork