void PreflowPushFlowSolver::discharge(int v) { while (excess[v] > 0) { if (indexOfCurrentEdge[v] == (int)graph.edge[v].size()) { relable(v); indexOfCurrentEdge[v] = 0; } else { FlowEdge *edge = graph.edge[v][indexOfCurrentEdge[v]]; if (edge->getCapacity() - edge->getFlow() > 0LL && height[edge->getFinishVertex()] == height[v] - 1) { push(edge); } else { indexOfCurrentEdge[v]++; } } } }
void MaxFlowPushPreFlow::discharge(int v) { int old_h = h[v]; int cur = current_push[v]; while (e[v] > 0) { if (cur == graph.graph[v].size()) { cur = 0; relable(v); } else { if (h[v] == h[graph.graph[v][cur]->to] + 1 && graph.graph[v][cur]->cap > 0) { push(graph.graph[v][cur]); } else { ++cur; } } } current_push[v] = cur; h_count[old_h] -= 1; h_count[h[v]] += 1; if (old_h < graph.n && h_count[old_h] == 0) gap(old_h); }