Cod sursa(job #2191729)

Utilizator cella.florescuCella Florescu cella.florescu Data 3 aprilie 2018 15:57:31
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e3;
const int INF = 0x3f3f3f3f;

vector < int > g[MAXN + 1];
int cap[MAXN + 1][MAXN + 1], flow[MAXN + 1][MAXN + 1], seen[MAXN + 1], father[MAXN + 1];
queue < int > q;

inline int bfs(int s, int d) {
  memset(seen, 0, sizeof seen);
  seen[s] = 1;
  q.push(s);
  while (q.empty() == false) {
    int node = q.front();
    q.pop();
    for (auto it : g[node])
      if (seen[it] == 0 && flow[node][it] < cap[node][it]) {
        seen[it] = 1;
        q.push(it);
        father[it] = node;
      }
  }
  return seen[d];
}

int main()
{
    int n, m;
    ifstream fin("maxflow.in");
    fin >> n >> m;
    for (int i = 0; i < m; ++i) {
      int x, y, z;
      fin >> x >> y >> z;
      cap[x][y] += z;
      g[x].push_back(y);
      g[y].push_back(x);
    }
    fin.close();
    int maxflow = 0;
    while (bfs(1, n))
      for (auto it : g[n]) {
        father[n] = it;
        int fl = INF;
        for (int node = n; node != 1; node = father[node])
          fl = min(fl, cap[father[node]][node] - flow[father[node]][node]);
        for (int node = n; node != 1; node = father[node]) {
          flow[father[node]][node] += fl;
          flow[node][father[node]] -= fl;
        }
        maxflow += fl;
      }
    ofstream fout("maxflow.out");
    fout << maxflow << '\n';
    fout.close();
    return 0;
}