Cod sursa(job #2817864)

Utilizator PetyAlexandru Peticaru Pety Data 14 decembrie 2021 13:16:52
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <bits/stdc++.h>


using namespace std;

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


int flow[1002][1002], c[1002][1002], dist[1002], par[1002], viz[1002], n, m;
vector<int>G[1002];

bool bfs () {
  for (int i = 1; i <= n; i++) {
    dist[i] = 1e9;
    viz[i] = 0;
  }
  queue<int>q;
  viz[1] = 1;
  dist[1] = 0;
  q.push(1);
  while (q.size()) {
    int nod = q.front();
    q.pop();
    if (nod == n)
      break;
    for (auto it : G[nod]) {
      if (!viz[it] && flow[nod][it] < c[nod][it]) {
        viz[it] = 1;
        q.push(it);
        par[it] = nod;
        dist[it] = dist[nod] + 1;
      }
    }
  }
  return viz[n];
}

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