Cod sursa(job #2456623)

Utilizator tudi98Cozma Tudor tudi98 Data 14 septembrie 2019 21:17:51
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>
using namespace std;

int n, m;
int cap[1005][1005];
int flow[1005][1005];
int T[1005];
bool seen[1005];
vector<int> G[1005];

bool bfs() {
  fill_n(T, 1005, 0);
  fill_n(seen, 1005, 0);
  queue<int> Q;
  Q.push(1);
  seen[1] = 1;

  while (Q.size()) {
    int u = Q.front();
    Q.pop();
    if (u == n) continue;
    for (auto p : G[u]) {
      if (flow[u][p] < cap[u][p] && !seen[p]) {
        T[p] = u;
        Q.push(p);
        seen[p] = 1;
      }
    }
  }

  return seen[n];
}

int main() {
  ios_base::sync_with_stdio(false);
  ifstream cin("maxflow.in");
  ofstream cout("maxflow.out");

  cin >> n >> m;
  while (m--) {
    int a, b, z;
    cin >> a >> b >> z;
    cap[a][b] = z;
    G[a].push_back(b);
    G[b].push_back(a);
  }

  int maxflow = 0;
  while (bfs()) {
    for (auto node : G[n]) {
      if (seen[node]) {
        int minflow = 1 << 30;
        T[n] = node;
        for (int i = n; i > 1; i = T[i])
          minflow = min(minflow, cap[T[i]][i] - flow[T[i]][i]);
        for (int i = n; i > 1; i = T[i])
          flow[T[i]][i] += minflow, flow[i][T[i]] -= minflow;
        maxflow += minflow;
      }
    }
  }

  cout << maxflow << "\n";
}