Cod sursa(job #1824696)

Utilizator akaprosAna Kapros akapros Data 8 decembrie 2016 12:02:25
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <bits/stdc++.h>


#define Nmax 1001
#define inf 0x7fffffff


using namespace std;


FILE *fin = freopen("maxflow.in", "r", stdin);
FILE *fout = freopen("maxflow.out", "w", stdout);


int n, m;
int S, D, ans;
int r[Nmax][Nmax];
int deUnde[Nmax];
queue < int > Q;


void read()
{
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= m; ++ i)
  {
    int x, y, z;
    scanf("%d %d %d", &x, &y, &z);
    r[x][y] = z;
  }
  S = 1;
  D = n;
}


bool BFS(int S, int D)
{
  int i;
  memset(deUnde, 0, sizeof(deUnde));
  Q.push(S);
  deUnde[S] = S;
  deUnde[D] = D;
  while (!Q.empty())
  {
    int x = Q.front();
    Q.pop();
    for (i = 1; i <= n; ++ i)
      if (r[x][i] > 0 && deUnde[i] == 0)
      {
        deUnde[i] = x;
        Q.push(i);
      }
  }
  for (int i = 1; i <= n; ++ i)
    if (i != D && r[i][D] > 0 && deUnde[i] != 0)
      return true;
  return false;
}


void solve()
{
  ans = 0;
  while (BFS(S, D)) {
    for(int u = 1; u <= n; u++)
      if (u != D && r[u][D] > 0 && deUnde[u] != 0) {
        deUnde[D] = u;
        int nod = D, cap = inf;
        while (nod != S)
        {
          cap = min(cap, r[deUnde[nod]][nod]);
          nod = deUnde[nod];
        }
        nod = D;
        ans += cap;
        while (nod != S)
        {
          r[deUnde[nod]][nod] -= cap;
          r[nod][deUnde[nod]] += cap;
          nod = deUnde[nod];
        }
      }
  }
}


void write()
{
  /*
  for (int i = 1; i <= n; ++ i) {
	for (int j = 1; j <= n; ++ j)
  	printf("%2d ", r[i][j]);
	printf("\n");
  }//*/
  printf("%d\n", ans);
}


int main() {
  read();
  solve();
  write();
  return 0;
}