RAMIFICACIÓN Y PODA
275
PROCEDURE QuitarCol(VAR m:mat_ady;j:CARDINAL;minimo:CARDINAL); VAR i:CARDINAL; BEGIN FOR i:=1 TO N DO IF m[i,j]<MAX(CARDINAL) THEN m[i,j]:=m[i,j]-minimo END; END; END QuitarCol;
Por otro lado, la estrategia de ramificación está a cargo de la función Expandir. Cada nodo puede generar, como hemos dicho antes, a lo sumo N–k hijos, que son los correspondientes a los vértices aún no incluidos en el recorrido. PROCEDURE Expandir(n:nodo;VAR hijos:ARRAY OF nodo):CARDINAL; VAR nk,i,j,l,coste,nhijos:CARDINAL; p:nodo; BEGIN nhijos:=0; nk:=n^.k+1; i:=n^.s[nk-1]; IF nk>N THEN (* caso especial *) RETURN nhijos END; FOR j:=1 TO N DO IF NoEsta(n^.s,nk-1,j) THEN INC(nhijos); Copiar(n,p); p^.s[nk]:=j; IF nk=N THEN (* recorrido completo *) INC(p^.coste,n^.matriz[i,j]+n^.matriz[j,1]) ELSE FOR l:=1 TO N DO p^.matriz[i,l]:=MAX(CARDINAL); p^.matriz[l,j]:=MAX(CARDINAL); END; p^.matriz[j,1]:=MAX(CARDINAL); INC(p^.coste,Reducir(p^.matriz)+n^.matriz[i,j]); END; INC(p^.k); hijos[nhijos-1]:=p; END END; RETURN nhijos; END Expandir;
Esta función hace uso de un procedimiento que permite duplicar un nodo: