19 std::vector<std::vector<int> > residual_capacity, capacity;
21 int total_edges = 0, source = 0, sink = 0;
22 std::vector<int> parent;
23 std::vector<std::tuple<int, int, int> > edge_participated;
24 std::bitset<MAXN> visited;
26 bool bfs(
int source,
int sink) {
30 while (q.empty() ==
false) {
31 int current_node = q.front();
32 visited.set(current_node);
34 for (
int i = 0; i < total_nodes; ++i) {
35 if (residual_capacity[current_node][i] > 0 && !visited[i]) {
37 parent[i] = current_node;
50 std::cin >> total_nodes >> total_edges >> source >> sink;
51 parent = std::vector<int>(total_nodes, -1);
52 capacity = residual_capacity = std::vector<std::vector<int> >(
53 total_nodes, std::vector<int>(total_nodes));
54 for (
int start = 0, destination = 0, capacity_ = 0, i = 0;
55 i < total_edges; ++i) {
56 std::cin >> start >> destination >> capacity_;
57 residual_capacity[start][destination] = capacity_;
58 capacity[start][destination] = capacity_;
61 void ford_fulkerson() {
62 while (bfs(source, sink)) {
63 int current_node = sink;
64 int flow = std::numeric_limits<int>::max();
65 while (current_node != source) {
66 int parent_ = parent[current_node];
67 flow = std::min(flow, residual_capacity[parent_][current_node]);
68 current_node = parent_;
72 while (current_node != source) {
73 int parent_ = parent[current_node];
74 residual_capacity[parent_][current_node] -= flow;
75 residual_capacity[current_node][parent_] += flow;
76 current_node = parent_;
80 void print_flow_info() {
81 for (
int i = 0; i < total_nodes; ++i) {
82 for (
int j = 0; j < total_nodes; ++j) {
84 residual_capacity[i][j] < capacity[i][j]) {
85 edge_participated.emplace_back(std::make_tuple(
86 i, j, capacity[i][j] - residual_capacity[i][j]));
90 std::cout <<
"\nNodes : " << total_nodes <<
"\nMax flow: " << max_flow
91 <<
"\nEdge present in flow: " << edge_participated.size()
93 std::cout <<
"\nSource\tDestination\tCapacity\total_nodes";
94 for (
auto& edge_data : edge_participated) {
95 int source = 0, destination = 0, capacity_ = 0;
96 std::tie(source, destination, capacity_) = edge_data;
97 std::cout << source <<
"\t" << destination <<
"\t\t" << capacity_
114 graph.ford_fulkerson();
115 graph.print_flow_info();