#include "wmatch.h"

/* updates numerical bounds for linking paths. */
/* called with LAST_D set to the bound on DELTA for the next search */

void SET_BOUNDS () 
{   int del;

    for (v=1; v <= U; ++v) {
	if (LINK[v] < 0 || BASE[v] != v) {
	    NEXT_D[v] = LAST_D;
	    continue;
	    }
	LINK[v] = -LINK[v];
	i = v;
	while (i != DUMMYVERTEX) {
	    Y[i] -= DELTA;
	    i = NEXTVTX[i];
	    }
	f = MATE[v];
	if (f != DUMMYEDGE) {
	    i = BEND(f);
	    del = SLACK(f);
	    while (i != DUMMYVERTEX) {
		Y[i] -= del;
		i = NEXTVTX[i];
		}
	    }
	NEXT_D[v] = LAST_D;
	}
}


/* undoes all blossoms to get the final matching */

void UNPAIR_ALL ()

{   int u;

    for (v=1; v <= U; ++v) {
	if (BASE[v] != v || LASTVTX[v] == v)
	    continue;
	nextu = v;
	NEXTVTX[LASTVTX[nextu]] = DUMMYVERTEX;
	while (1) {
	    u = nextu;
	    nextu = NEXTVTX[nextu];
	    UNLINK (u);
	    if (LASTVTX[u] != u) {
		f = (LASTEDGE[2] == OPPEDGE(e)) ? LASTEDGE[1] : LASTEDGE[2];
		NEXTVTX[LASTVTX[BEND(f)]] = u;
		}
	    newbase = BMATE (BMATE(u));
	    if (newbase != DUMMYVERTEX && newbase != u) {
		LINK[u] = -DUMMYEDGE;
		REMATCH (newbase, MATE[u]);
		}
	    while (LASTVTX[nextu] == nextu && nextu != DUMMYVERTEX)
		    nextu = NEXTVTX[nextu];
	    if (LASTVTX[nextu] == nextu && nextu == DUMMYVERTEX)
		break;
	    }
	}
}


