matlab图论程序算法大全Word文档下载推荐.docx

上传人:b****8 文档编号:22534571 上传时间:2023-02-04 格式:DOCX 页数:39 大小:24.91KB
下载 相关 举报
matlab图论程序算法大全Word文档下载推荐.docx_第1页
第1页 / 共39页
matlab图论程序算法大全Word文档下载推荐.docx_第2页
第2页 / 共39页
matlab图论程序算法大全Word文档下载推荐.docx_第3页
第3页 / 共39页
matlab图论程序算法大全Word文档下载推荐.docx_第4页
第4页 / 共39页
matlab图论程序算法大全Word文档下载推荐.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

matlab图论程序算法大全Word文档下载推荐.docx

《matlab图论程序算法大全Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《matlab图论程序算法大全Word文档下载推荐.docx(39页珍藏版)》请在冰豆网上搜索。

matlab图论程序算法大全Word文档下载推荐.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 商业计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1