Cod sursa(job #2468888)

Utilizator lucametehauDart Monkey lucametehau Data 6 octombrie 2019 10:42:54
Problema Flux maxim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>

using namespace std;

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

int n, m, x, y, z;

bool viz[1005];
int tata[1005];
int cap[1005][1005], res[1005][1005];
queue <int> q;

bool bfs(int src, int dst) {
  q.push(src);
  for(int i = 1; i <= n; i++)
    viz[i] = 0;
  viz[src] = 1;
  while(!q.empty()) {
    int nod = q.front();
    q.pop();
    for(int vec = 1; vec <= n; vec++) {
      if(!viz[vec] && res[nod][vec] > 0) {
        q.push(vec);
        tata[vec] = nod;
        viz[vec] = 1;
      }
    }
  }
  return viz[dst];
}

int maxflow(int src, int dst) {
  int maxFlow = 0;
  for(int i = 1; i <= n; i++) {
    for(int j = 1; j <= n; j++)
      res[i][j] = cap[i][j];
  }
  while(bfs(src, dst)) {
    int minFlow = 1e9, nod = dst;
    while(nod != src) {
      minFlow = min(minFlow, res[tata[nod]][nod]);
      nod = tata[nod];
    }
    nod = dst;
    while(nod != src) {
      res[tata[nod]][nod] -= minFlow;
      res[nod][tata[nod]] += minFlow;
      nod = tata[nod];
    }
    maxFlow += minFlow;
  }
  return maxFlow;
}

int main() {
  cin >> n >> m;
  for(; m; m--) {
    cin >> x >> y >> z;
    cap[x][y] = z;
  }
  cout << maxflow(1, n);
  return 0;
}