Cod sursa(job #2674459)

Utilizator PetyAlexandru Peticaru Pety Data 19 noiembrie 2020 11:11:32
Problema Flux maxim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");

int n, m, c[1002][1002], flux[1002][1002], viz[1002], p[1002];
vector<int>G[1002];

bool bfs () {
  memset(viz, 0, sizeof(viz));
  queue<int>q;
  q.push(1);
  viz[1] = 1;
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (auto it : G[x])
    if (flux[x][it] < c[x][it] && !viz[it]) {
      viz[it] = 1;
      p[it] = x;
      q.push(it);
    }
  }
  return viz[n];
}

int main()
{
  fin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int x, y, f;
    fin >> x >> y >> f;
    c[x][y] = f;
    G[x].push_back(y);
    G[y].push_back(x);
  }
  int ans = 0;
  while (bfs()) {
    for (auto it : G[n])
      if (flux[it][n] < c[it][n] && viz[it]) {
        int fmin = 1e9;
        p[n] = it;
        for (int nod = n; nod != 1; nod = p[nod])
          fmin = min(fmin, c[p[nod]][nod] - flux[p[nod]][nod]);
        for (int nod = n; nod != 1; nod = p[nod]) {
          flux[p[nod]][nod] += fmin;
          flux[nod][p[nod]] -= fmin;
        }
        ans += fmin;
      }
  }
  fout << ans;
  return 0;
}