/* augmentPath.c */
#include "../Network.h"
/*--------------------------------------------------------------------*/
/*
----------------------------------------------------------------
given an augmenting path defined by the pred[] vector and delta,
the change in flow, augment the path from the source to the sink
created -- 86jun08, cca
----------------------------------------------------------------
*/
void
Network_augmentPath (
Network *network,
int delta,
int pred[]
) {
Arc *arc ;
Arc **inheads, **outheads ;
FILE *msgFile ;
int msglvl, nnode, sink, source, v, w ;
/*
---------------
check the input
---------------
*/
if ( network == NULL || (nnode = network->nnode) <= 0
|| delta <= 0 || pred == NULL ) {
fprintf(stderr, "\n fatal error in Network_augmentPath(%p,%d,%p)"
"\n bad input\n",
network, delta, pred) ;
exit(-1) ;
}
source = 0 ;
sink = nnode - 1 ;
inheads = network->inheads ;
outheads = network->outheads ;
msglvl = network->msglvl ;
msgFile = network->msgFile ;
/*
-----------------------
work back from the sink
-----------------------
*/
if ( msglvl > 2 ) {
fprintf(msgFile, "\n\n augment path") ;
fflush(msgFile) ;
}
w = sink ;
while ( 1 ) {
v = pred[w] ;
if ( msglvl > 2 ) {
fprintf(msgFile, "\n w = %d, v = %d", w, v) ;
}
for ( arc = inheads[v] ; arc != NULL ; arc = arc->nextIn ) {
network->ntrav++ ;
if ( arc->first == w ) {
arc->flow -= delta ;
if ( msglvl > 2 ) {
fprintf(msgFile, "\n backward arc(%d,%d), flow = %d",
w, v, arc->flow) ;
}
break ;
}
}
if ( arc == NULL ) {
for ( arc = outheads[v] ; arc != NULL ; arc = arc->nextOut ) {
network->ntrav++ ;
if ( arc->second == w ) {
arc->flow += delta ;
if ( msglvl > 2 ) {
fprintf(msgFile, "\n forward arc(%d,%d), flow = %d",
v, w, arc->flow) ;
}
break ;
}
}
}
if ( v == source ) {
break ;
}
w = v ;
}
return ; }
/*--------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1