Está en la página 1de 3

function [ cap,flujo,e,L ] = fordfulkerson(cap,flujo) %Nodos etiquetados no examinados %x() es la lista de nodos adyacentes a x %e vector de etiquetas con nodo y flujo

(x,min{ex,c(x,y)-g(x,y)}) %L lista de nodos etiquetados no examinados %nodo es la variable que indica qu nodo va a ser examinado %l cuenta cuantos nodos hubo adyacentes a x %n cuantos nodos tiene la red %cual es la cantidad de nodos que estn en L %g flujo al nodo s %nodoultimo nodo al q se le cambio el flujo %w indice del while de cambio de flujo %nodo1 y nodo2 el vector para aumentar el flujo en la matriz de flujo %nl cuantos nodos estan conectados con x g=0; nl=1; [n,m]= size(cap); x=zeros(n,1); L=zeros(nl,1); e=zeros(n,2); e(1,1)=-1; e(1,2)=100000; nodoultimo=0; w=0; nodo=1; l=1; nodo1=0; nodo2=0; posicion=0; renL=1; L(1,1)=1;

%L~=zeros(nl,1) while e(n,1)==0 || renL>0 %while e(n,1)==0 || L~=zeros(nl,1) %obtener nodos adyacentes a x for i=1:n if cap(nodo,i)~=0 x(l,1)=i; l=l+1; end nl=l-1; end x %etiquetar nodos adyacentes y no etiquetados for i=1:nl if e(x(i,1),1)==0 %no esta etiquetado cont=0; if (cap(nodo,x(i,1))-flujo(nodo,x(i,1)))>0 %agregarle los nodos q encontramos a L y quitarle el nodo %revisado if e(x(i,1),2)~=0 e(x(i,1),2)=min(e(nodo,2),cap(nodo,x(i,1))-flujo(nodo,x(i,1))); cont=cont+1; else e(x(i,1),2)=cap(nodo,x(i,1))-flujo(nodo,x(i,1));

cont=cont+1; end e(x(i,1),1)=nodo; g=cap(nodo,x(i,1))-flujo(nodo,x(i,1)) a=1; while a<=cont && L(a,1)~=0 a=a+1; end L(a,1)=x(i,1); %quitar el nodo revisado for b=1:nl if L(b,1)==nodo L(b,1)=0; posicion=b; end end for c=posicion:1 L(c,1)=L(c+1,1); end lprim=L; [nprima,mprima]=size(L); L=zeros(nprima-1,1); for d=1:nprima-1 L(d,1)=lprim(d,1); end end end end e A=zeros(nl,1) if L==A %g maximo y tenemos corte minimo g=10; else %se marco el nodo s y tenemos camino de aumento % for i=1:n if e(n,1)>0 %incrementar flujo e(nodo,1)=e(nodo,1)+g; nodoultimo=nodo; while nodoultimo>0 nodo1=nodoultimo; nodo1 e(nodoultimo,1)=e(nodoultimo,1)+g; nodoultimo=e(nodoultimo,1); nodo2=nodoultimo; nodo2 flujo(nodo1,nodo2)=flujo(nodo1,nodo2)+g; end e(1,1)=e(1,1)+g; else %decrementar flujo e(nodo,1)=e(nodo,1)+g; nodoultimo=nodo; while nodoultimo>1 nodo1=nodoultimo; e(nodoultimo,1)=e(nodoultimo,1)-g;

nodoultimo=e(nodoultimo,1); nodo2=nodoultimo; flujo(nodo1,nodo2)=flujo(nodo1,nodo2)-g; end e(1,1)=e(1,1)-g; end e=zeros(n,2); end l=1; x x=zeros(n,1); e(1,1)=-1; e(1,2)=100000; [renL,colL]=size(L); e L nl=1; nodo=L(1,1); end end

También podría gustarte