Cod sursa(job #2188319)

Utilizator NeredesinI am not real Neredesin Data 27 martie 2018 08:49:57
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <algorithm>
#include <iostream>
#include <fstream>
#include <climits>
#include <queue>

using namespace std;

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

const int NMAX = 1e3;

struct Edge {
  int to;
  int rev;
  int flow;
  int cap;
};

int n, m, src, dest;
int cap[1 + NMAX][1 + NMAX];
int dist[1 + NMAX];
int rem[1 + NMAX];

vector < Edge > g[1 + NMAX];

void addedge(int i, int j) {
  Edge direct = {j, g[j].size(), 0, cap[i][j]};
  Edge inverse = {i, g[i].size(), 0, cap[j][i]};

  g[i].push_back(direct);
  g[j].push_back(inverse);
}

bool bfs() {
  fill(dist + 1, dist + n + 1, -1);
  queue < int > q;

  dist[src] = 0;
  q.push(src);

  while(!q.empty()) {
    int from = q.front();
    q.pop();

    for(auto e : g[from]) {
      if(dist[e.to] < 0 && e.flow < e.cap) {
        dist[e.to] = dist[from] + 1;
        q.push(e.to);
      }
    }
  }

  return (0 <= dist[dest]);
}

int dfs(int from, int deltaflow) {
  if(from == dest)
    return deltaflow;
  else {
    for(int i = rem[from]; i < g[from].size(); i++) {
      Edge &e = g[from][i];
      if(dist[e.to] == dist[from] + 1) {
        int addflow = dfs(e.to, min(deltaflow, e.cap - e.flow));
        if(0 < addflow) {
          e.flow += addflow;
          g[e.to][e.rev].flow -= addflow;
          rem[from] = i;
          return addflow;
        }
      }
    }
  }
  return 0;
}

int maxflow() {
  int res = 0;
  while(bfs() == true) {
    fill(rem + 1, rem + n + 1, 0);
    while(int deltaflow = dfs(src, INT_MAX))
      res += deltaflow;
  }

  return res;
}

int main()
{
  in >> n >> m;
  src = 1;
  dest = n;

  for(int i = 1; i <= m; i++) {
    int x, y, z;
    in >> x >> y >> z;
    cap[x][y] = z;
  }

  for(int i = 1; i <= n; i++)
    for(int j = i + 1; j <= n; j++)
      if(cap[i][j] != 0 || cap[j][i] != 0)
        addedge(i, j);

  out << maxflow() << '\n';

  in.close();
  out.close();
  return 0;
}