Cod sursa(job #1215435)

Utilizator OwlreeRobert Badea Owlree Data 1 august 2014 01:45:23
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 1024;

int resid[NMAX][NMAX];
int from[NMAX];
int N, M;
int flow;

bool BFS()
{
  queue <int> q;
  fill(from, from + NMAX, 0);
  from[0] = 0;
  from[1] = 0;

  q.push(1);

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

    for (int i = 1; i <= N; ++i) {
      if (from[i] == 0 && resid[node][i] > 0) {
        from[i] = node;
        q.push(i);

        if (i == N) {
          return true;
        }
      }
    }
  }
  return false;
}

int main()
{
  ifstream  in("maxflow.in");
  ofstream out("maxflow.out");

  in >> N >> M;

  for (int i = 0; i < NMAX; ++i) {
    for (int j = 0; j < NMAX; ++j) {
      resid[i][j] = -1;
    }
  }

  for (int i = 0; i < M; ++i) {
    int a, b, c;
    in >> a >> b >> c;
    resid[a][b] = c;
    resid[b][a] = 0;
  }

  while (BFS()) {
    for (int i = 1; i < N; ++i) {
      if (resid[i][N] > 0) {
        if (from[i] == 0 || resid[i][N] == 0) {
          continue;
        } else {
          from[N] = i;
          int add = INT_MAX;
          int x = N;
          while (x != 1) {
            add = min(add, resid[from[x]][x]);
            x = from[x];
          }

          x = N;
          while (x != 1) {
            resid[from[x]][x] -= add;
            resid[x][from[x]] += add;
            x = from[x];
          }

          flow += add;
        }
      }
    }
  }

  out << flow;

  return 0;
}