Cod sursa(job #2234306)

Utilizator PetyAlexandru Peticaru Pety Data 25 august 2018 15:13:01
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>

using namespace std;

int n, m;
vector<int>g[1002];
int c[1002][1002], f[1002][1002], p[1002], ans;
bool viz[1002];

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

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

int main()
{
  fin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int x, y, z;
    fin >> x >> y >> z;
    c[x][y] = z;
    g[x].push_back(y);
    g[y].push_back(x);
  }
  while (bfs()) {
    for (int i = 0; i < g[n].size(); i++) {
      int v = g[n][i];
      if (c[v][n] > f[v][n] && viz[v]) {
        p[n] = v;
        int fmin = 1000000000;
        for (int i = n; i != 1; i = p[i])
          fmin = min(fmin, c[p[i]][i] - f[p[i]][i]);
         for (int i = n; i != 1; i = p[i]) {
           f[p[i]][i] += fmin;
           f[i][p[i]] -= fmin;
         }
        ans += fmin;
      }
    }
  }
  fout << ans;
  return 0;
}