(true) { list<Edge*> path; list<int> visited; if (dfs(graph, src, dst, path, visited) == false) break; int min_flow = 1; for (auto edge : path) { edge->flow += min_flow; auto* antiEdge = get_edge(graph, edge->to_number, edge->from_number); antiEdge->flow -= min_flow; } } } struct Node { int number; vector<Edge*> adjacent; // список инцидентности } struct Edge { int from_number; // номер узла, из которого выходит дуга int to_number; // номер узла, в который входит дуга int flow; // поток через дугу int flow_capacity; // пропускная способность дуги int residual_flow() { return flow_capacity - flow; } } Edge* get_edge(vector<Node*>& graph, int src, int dst) { auto& adjacent = graph[src]->adjacent; for (auto edge : adjacent) { if (edge->to_number == dst) return edge; } return nullptr; } Алгоритм Форда-Фалкерсона