function [x,fobj,pi,sN,iter,B,N,Binv] = dual_simplex(c,A,b,eps1,B0)
%   Resuelve Max c'x subject to Ax = b, x >= 0 mediante Simplex Dual
%    B0 es una base de partida.
%
 [m,n]=size(A); c=c(:); b=b(:);
 % Paso 0: Inicializar B, N, x_B y s_N                -1           -T
 B = B0; N = setdiff(1:n,B);                    % x =B  b, lambda=B  c
 xB=A(:,B)\b; x=zeros(n,1); x(B)=xB;            %  B     T             B
 y = A(:,B)'\c(B); sN = c(N)-A(:,N)'*y;         % c =c -N lambda
                                                %  N  N
 iter = 0; disp('It.  Sale B Entra B      Pinf   Ninf  Cr-inf');
 while 1 == 1         % Proceso iterativo
 % Pasos 1 y 2: Comprobar optimalidad; si no, ha de dejar la base x_{B(i)}
    [xBmin,i] = min(xB);                        % Valor más negativo xb
    if xBmin >= -eps1                           % No hay no factibles, final    
       fobj=c'*x; Binv=inv(A(:,B)); pi=Binv'*c(B); return, end 
 % Paso 3 y 4: Ver no facti. y la variable nobásica que entra, x_{N(j)}
    e = zeros(m,1); e(i) = 1;              % Negativos en vector  T -T
    v = A(:,B)'\e;                         %                 w = N B  e
    w = A(:,N)'*v;                         %                           i
    zz = find(w<-eps1);
    if isempty(zz), error('Problema no factible'), end
    [t,ii] = min(-sN(zz)./w(zz));          % Coste reducido relación con w menor
    j = zz(ii);                            % Entra no básica j
 % Paso 5: Recalcular costes reducidos: la j la rel. menor; demás=ant.+t*w
    sN = sN + t*w; sN(j) = t;       
 % Paso 6: Adaptar solución, xB, y datos        -1   -1    -1
    d = A(:,B)\A(:,N(j));                  % x =B  b-B  N (B  b/w(j))
    temp = B(i); B(i) = N(j); N(j) = temp; %  B          j
    theta=xB(i)/w(j); xB=xB-theta*d; xB(i)=theta; x=zeros(n,1); x(B)=xB;
    iter = iter + 1;
    fprintf('%3d%6d%7d %14.6f %3d %6d\n',iter,temp,B(i),...
      sum(x(x<0)),sum(x<0),sum(sN<0));
 end
end