Cod sursa(job #2453461)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 3 septembrie 2019 20:06:59
Problema Flux maxim Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>

using namespace std;

const int N = 1000 + 7;

struct dumbFlow {
  int n;
  int cap[N][N];
  int par[N];
  vector <int> g[N];
  bool vis[N];

  void AddEdge(int a, int b, int c) {
    cap[a][b] += c;
    g[a].push_back(b);
    g[b].push_back(a);
  }

  bool BFS() {
    for (int i = 1; i <= n; i++) {
      vis[i] = 0;
    }
    queue <int> Q;
    Q.push(1);

    while (!Q.empty()) {
      int nod = Q.front();
      Q.pop();

      if (nod == n) {
        continue;
      }

      for (auto &nou : g[nod]) {
        if (!vis[nou] && cap[nod][nou]) {
          vis[nou] = 1;
          par[nou] = nod;
          Q.push(nou);
        }
      }

    }
    return vis[n];
  }

  int maxFlow() {
    int flow = 0;

    while (BFS()) {
      for (auto &nod : g[n]) {
        if (vis[nod]) {
          int curNode = nod, curMin = (1 << 30);
          while (curMin > 0 && curNode != 1) {
            curMin = min(curMin, cap[par[curNode]][curNode]);
            curNode = par[curNode];
          }
          if (curMin > 0) {
            flow += curMin;
            int curNode = nod;
            while (curNode != 1) {
              cap[par[curNode]][curNode] -= curMin;
              cap[curNode][par[curNode]] += curMin;
              curNode = par[curNode];
            }
          }
        }
      }
    }

    return flow;
  }

};

dumbFlow myFlow;

int main() {
  freopen ("maxflow.in", "r", stdin);
  freopen ("maxflow.out", "w", stdout);

  int m;
  cin >> myFlow.n >> m;

  for (int i = 0; i < m; i++) {
    int a, b, c;
    cin >> a >> b >> c;
    myFlow.AddEdge(a, b, c);
  }
  printf("%d\n", myFlow.maxFlow());

  return 0;
}