1、 %前向弧调整量elseif(a(s(t),t)dvtt)dvt=dvtt;if(s(t)=1)break;end %当t 的标号为vs 时, 终止计算调整量t=s(t);end %继续调整前一段弧上的流fif(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)
2、;end %计算最大流量zwf=0;n)zwf=zwf+b(i,j)*f(i,j);end%计算最小费用f %显示最小费用最大流图 6-22wf %显示最小费用最大流量zwf %显示最小费用, 程序结束_Kruskal 避圈法:Kruskal 避圈法的MATLAB 程序代码如下:n=8;A=0 2 8 1 0 0 0 02 0 6 0 1 0 0 08 6 0 7 5 1 2 01 0 7 0 0 0 9 00 1 5 0 0 3 0 80 0 1 0 3 0 4 60 0 2 9 0 4 0 30 0 0 0 8 6 3 0;k=1; %记录A中不同正数的个数n-1)for(j=i+1:n)
3、 %此循环是查找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)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)p
4、d=1;if(pd)T(i,j)=0;T(j,i)=0; %假如TT 中有圈else q=q+1;T %显示近似最小生成树T, 程序结束用Warshall-Floyd 算法求任意两点间的最短路.A=0 2 8 1 Inf Inf Inf Inf2 0 6 Inf 1 Inf Inf Inf8 6 0 7 5 1 2 Inf1 Inf 7 0 Inf Inf 9 InfInf 1 5 Inf 0 3 Inf 8Inf Inf 1 Inf 3 0 4 6Inf Inf 2 9 Inf 4 0 3Inf Inf Inf Inf 8 6 3 0; % MATLAB 中, Inf 表示D=A; %赋初值
5、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); %更新dijR(i,j)=k;end %更新rijk %显示迭代步数D %显示每步迭代后的路长R %显示每步迭代后的路径for i=1:n %含有负权时if(D(i,i)end %存在一条含有顶点vi 的负回路end %存在一条负回路, 终止程序end %程序结束利用 Ford-Fulkerson 标号法求最大流算法的MATLAB 程序代码如下:C=0 5 4 3 0 0 0 00 0 0 0 5 3 0 00 0 0 0 0 3 2 00
6、0 0 0 0 0 2 00 0 0 0 0 0 0 40 0 0 0 0 0 0 30 0 0 0 0 0 0 50 0 0 0 0 0 0 0;n)No(i)=0;d(i)=0;end %No,d 记录标号图 6-19No(1)=n+1;d(1)=Inf; %给发点vs 标号 %标号过程n)if(No(i) %选择一个已标号的点vifor(j=1:n)if(No(j)=0&f(i,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;en
7、d%若收点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); %继续调整前一段弧上的流ff %显示最大流wf %显示最大流量No %显示标号, 由此可得最小割, 程序结束图论程序大全程序一:关联矩阵和邻接矩阵互换算法function W=incandadf(F,f)if f=0 m=sum(sum(F)/2; n=s
8、ize(F,1); W=zeros(n,m); k=1; for i=1:n for j=i: if F(i,j)=0 W(i,k)=1; W(j,k)=1; k=k+1; endelseif f=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(Please imput the right value of f);W;程序二:可达矩阵算法function P=dgraf(A)n=size(A,1);P=A;for i=2: P=P+Ai;P(P=0)=1;P;程序三
9、:有向图关联矩阵和邻接矩阵互换算法function W=mattransf(F,f) m=sum(sum(F); W(j,k)=-1; if F(a(1),i)=1 else 第二讲:最短路问题Dijkstra算法(计算两点间的最短路)function l,z=Dijkstra(W)n = size (W,1);for i = 1 :n l(i)=W(1,i); z(i)=0;end i=1;while il(j)+W(j,i) l(i)=l(j)+W(j,i); z(i)=j-1; if ji i=j-1; i=i+1;floyd算法(计算任意两点间的最短距离)function d,r=fl
10、oyd(a) n=size(a,1); d=a; for j=1: r(i,j)=j; end r; for k=1: if d(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 P u=n2short(W,k1,k2)n=length(W);U=W;m=1;while mU(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;while
11、 kk=k1 V(1,i)=U(k1,kk)-W(i,kk); if V(1,i)=U(k1,i) P1(k+1)=i; kk=i;wrow=find(P1=0);for j=length(wrow):-1:1 P(k)=P1(wrow(j);程序四、n1short.m(计算某点到其它所有点的最短距离)functionPm D=n1short(W,k)n=size(W,1);D=zeros(1,n); P d=n2short(W,k,i); Pmi=P; D(i)=d;程序五:pass2short.m(计算经过某两点的最短距离)function P d=pass2short(W,k1,k2,t
12、1,t2) p1 d1=n2short(W,k1,t1);p2 d2=n2short(W,t1,t2);p3 d3=n2short(W,t2,k2);dt1=d1+d2+d3;p4 d4=n2short(W,k1,t2);p5 d5=n2short(W,t2,t1);p6 d6=n2short(W,t1,k2);dt2=d4+d5+d6;if dt1dt2 d=dt1; P=p1 p2(2:length(p2) p3(2:length(p3);else p=p4 p5(2:length(p5) p6(2:length(p6);d;第三讲:最小生成树最小生成树的Kruskal算法function
13、 T c=krusf(d,flag)if nargin=1 n=size(d,2); m=sum(sum(d=0)/2; b=zeros(3,m); for j=(i+1): if d(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; if t(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
14、(B(1,i),t(B(2,i); if t(j)=tmax t(j)=tmin; if k=n break;T;c;最小生成树的Prim算法function T c=Primf(a)l=length(a);a(a=0)=inf;k=1:l;listV(k)=0;listV(1)=1;e=1;while (ea(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;for g=1:e-1 c(g)=a(T(1,
15、g),T(2,g);另外两种程序最小生成树程序1(prim 算法构造最小生成树)a=inf 50 60 inf inf inf inf;50 inf inf 65 40 inf inf;60 inf inf 52 inf inf 45;. inf 65 52 inf 50 30 42;inf 40 inf 50 inf 70 inf;inf inf inf 30 70 inf inf; inf inf 45 42 inf inf inf;result=;p=1;tb=2:length(a);while length(result)=length(a)-1temp=a(p,tb);temp=te
16、mp(: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=ijb;index=data(1:loop=max(size(
17、a)-1;while length(result)looptemp=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);index(find(index=v2)=v1;data(:,flag)=;index(:第四讲:Euler图和Hamilton图Fleury算法(在一个Euler图中找出Euler环游)注:包括三个文件;fleuf1.m, edf.m, flec
18、vexf.mfunction T c=fleuf1(d)%注:必须保证是Euler环游,否则输出T=0,c=0n=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; if mod(a(i),2)=1if m=0 fprintf(there is not exit Euler path.n) T=0;c=0;if m=0 vet=1; flag=0; t1=find(matr(vet,:)=1); for ii=1:length(t1) ed
19、(:,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; for g=1:eds c=c+d(T(1,g),T(2,g); flagg=0;functionflag ed=edf(matr,eds,vexs,ed,tem)flag=1; dvex f=flecvexf(matr,i,vexs,eds,ed,tem); if f=1 if dvex=0,i)=vexs(1,i) dvex; vexs(1,i+1)=dvex; matr(vexs(1,i+1),vexs(1,i)=0; elsefunction dvex f=flecvexf(matr,i,vexs,eds,ed,temp)f=0;edd=find(matr(vexs(1,i),:dvex=0;dvex1=;ded=;if length(edd)=1 dvex=edd; dd=1;dd1=0;kkk=0; for kk=1:length(edd) m
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1