㈠ 最大流 flow函數的n,s,t,分別代表什麼
function [f,wf,No]=MaxFlowMinCut_Me(n,C)
% 利用Ford--Fulkerson 標號求流算MATLAB 程序代碼
% f %顯示流
% wf %顯示流量
% No %顯示標號, 由割
% n 節點數
% C %弧容量
% Example:
% n=8;
% C=[0 5 4 3 0 0 0 0
% 0 0 0 0 5 3 0 0
% 0 0 0 0 0 3 2 0
% 0 0 0 0 0 0 2 0
% 0 0 0 0 0 0 0 4
% 0 0 0 0 0 0 0 3
% 0 0 0 0 0 0 0 5
% 0 0 0 0 0 0 0 0];
% [f,wf,No]=MaxFlowMinCut_Me(n,C)
for(i=1:n)for(j=1:n)f(i,j)=0;end;end %取初始行流f 零流
for(i=1:n)No(i)=0;d(i)=0;end %No,d 記錄標號
while(1)
No(1)=n+1;d(1)=Inf; %給發點vs 標號
while(1)pd=1; %標號程
for(i=1: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);pd=0;
if(d(j)>d(i))d(j)=d(i);end
elseif(No(j)==0&f(j,i)>0) %於未給標號點vj, vjvi 非零流弧
No(j)=-i;d(j)=f(j,i);pd=0;
if(d(j)>d(i))d(j)=d(i);end;end;end;end;end
if(No(n)|pd)break;end;end %若收點vt 標號或者標號, 終止標號程
if(pd)break;end %vt 未標號, f 已流, 算終止
dvt=d(n);t=n; %進入調整程, dvt 表示調整量
while(1)
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;end %向弧調整
if(No(t)==1)for(i=1:n)No(i)=0;d(i)=0; end;break;end %t 標號vs , 終止調整程
t=No(t);end;end; %繼續調整前段弧流f
wf=0;for(j=1:n)wf=wf+f(1,j);end
end