示例#1
0
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]++;
			}
		}
	}
}
示例#2
0
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);
}