int64 PushRelabel::getFlow() { findFlow(); int64 flow = 0; FlowGraph::iterator edgeIterator; for (edgeIterator = graph->begin(source); edgeIterator != graph->end(source); ++edgeIterator) flow += (*edgeIterator).getFlow(); return flow; }
/* return relevent flow for the new packet if not exist , create a new one and push it to the heap */ Flow* getFlow(const Packet* p , bool* insertP, bool virtual_f) { Flow* f = findFlow(p, virtual_f); *(insertP) = FALSE; if (f == NULL) { f = createFlow(p, virtual_f); *(insertP) = TRUE; } return f; }
int FordFlukerson(int s,int t,int n) { int maxFlow = 0; while(1) { memset(visited, 0, sizeof(visited)); if (!DFS(s,t,n)) break; maxFlow += findFlow(s,t); } return maxFlow; }