Cod sursa(job #2210200)

Utilizator lucametehauDart Monkey lucametehau Data 5 iunie 2018 21:22:30
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
#include <cstring>
#include <vector>

using namespace std;

ifstream cin ("maxflow.in");
ofstream cout ("maxflow.out");

const int NMAX = 1000;
const int INF = 2e9;

int n, m;
int x, y, c;
int maxflow;

bool viz[1 + NMAX];
int tata[1 + NMAX];
int cap[1 + NMAX][1 + NMAX], flow[1 + NMAX][1 + NMAX];
vector <int> g[1 + NMAX];

bool bfs() {
  int q[1 + NMAX];
  q[0] = 0;
  q[++q[0]] = 1;
  memset(viz, 0, sizeof(viz));
  viz[1] = 1;
  int i = 1;
  while(i <= q[0]) {
    int nod = q[i];
    i++;
    if(nod == n)
      continue;
    for(int j = 0; j < g[nod].size(); j++) {
      int nod2 = g[nod][j];
      if(cap[nod][nod2] == flow[nod][nod2] || viz[nod2])
        continue;
      viz[nod2] = 1;
      q[++q[0]] = nod2;
      tata[nod2] = nod;
    }
  }
  return viz[n];
}

int main() {
  cin >> n >> m;
  for(int i = 1; i <= m; i++) {
    cin >> x >> y >> c;
    cap[x][y] += c;
    g[x].push_back(y);
    g[y].push_back(x);
  }
  maxflow = 0;
  while(bfs()) {
    for(int i = 0; i < g[n].size(); i++) {
      int nod = g[n][i];
      if(flow[nod][n] == cap[nod][n] || !viz[nod])
        continue;
      tata[n] = nod;
      int minflow = INF;
      nod = n;
      while(nod != 1) {
        minflow = min(minflow, cap[tata[nod]][nod] - flow[tata[nod]][nod]);
        nod = tata[nod];
      }
      if(minflow == 0)
        continue;
      nod = n;
      while(nod != 1) {
        flow[tata[nod]][nod] += minflow;
        flow[nod][tata[nod]] -= minflow;
        nod = tata[nod];
      }
      maxflow += minflow;
    }
  }
  cout << maxflow;
  return 0;
}