Cod sursa(job #2218028)

Utilizator Anastasia11Susciuc Anastasia Anastasia11 Data 2 iulie 2018 23:09:31
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>
#define Nmax 1005
#define INF 0x3f3f3f3f

using namespace std;

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

vector < int > v[Nmax + 1];
int cap[Nmax + 1][Nmax + 1], flow[Nmax + 1][Nmax + 1], seen[Nmax + 1], father[Nmax + 1];
queue < int > Q;

inline int bfs(int s, int d)
{
  memset(seen, 0, sizeof seen);
  seen[s] = 1;
  Q.push(s);
  while (Q.empty() == false)
   {
    int node = Q.front();
    Q.pop();
    if (node != d)
      for (auto it : v[node])
        if (seen[it] == 0 && flow[node][it] < cap[node][it])
         {
          seen[it] = 1;
          Q.push(it);
          father[it] = node;
        }
  }
  return seen[d];
}

int main()
{
    int n, m;

    f >> n >> m;
    for (int i = 0; i < m; i ++ )
    {
      int x, y, z;
      f >> x >> y >> z;
      cap[x][y] += z;
      v[x].push_back(y);
      v[y].push_back(x);
    }

    int maxflow = 0;
    while ( bfs(1, n) )
      for (auto it : v[n])
        if (seen[it] && flow[it][n] < cap[it][n])
         {
        father[n] = it;
        int fl = INF;
        for (int node = n; node != 1; node = father[node])
          fl = min(fl, cap[father[node]][node] - flow[father[node]][node]);
        for (int node = n; node != 1; node = father[node])
        {
          flow[father[node]][node] += fl;
          flow[node][father[node]] -= fl;
        }
        maxflow += fl;
      }

    g << maxflow ;

    return 0;
}