Cod sursa(job #2753021)

Utilizator Razvan48Capatina Razvan Nicolae Razvan48 Data 20 mai 2021 18:51:13
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <climits>
#include <queue>

using namespace std;

const int NMAX = 1000;
const int MMAX = 5000;

int n;

vector<int> graf[1 + NMAX];

int capacitate[1 + NMAX][1 + NMAX];
int tata[1 + NMAX];

bool lantGasit;

queue<int> q;

void bfs(int start)
{
  lantGasit = false;
  memset(tata, 0, sizeof(tata));

  tata[1] = 1;
  q.emplace(start);

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

    for (auto& vecin : graf[nod])
    {
      if (tata[vecin] == 0 && capacitate[nod][vecin] > 0)
      {
        if (vecin != n)
        {
          tata[vecin] = nod;
          q.emplace(vecin);
        }
        else
          lantGasit = true;
      }
    }
  }
}

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

  int m;
  in >> n >> m;

  for (int j = 1; j <= m; j++)
  {
    int x, y, z;

    in >> x >> y >> z;

    graf[x].emplace_back(y);
    graf[y].emplace_back(x);

    capacitate[x][y] = z;
  }

  int maxFlow = 0;

  while (true)
  {
    bfs(1);

    if (!lantGasit)
      break;

    for (auto& vecin : graf[n])
    {
      int capMinima = INT_MAX;
      tata[n] = vecin;
      for (int nodCrt = n; tata[nodCrt] != nodCrt; nodCrt =   tata[nodCrt])
      {
        capMinima = min(capMinima, capacitate[tata[nodCrt]][nodCrt]);
      }

      for (int nodCrt = n; tata[nodCrt] != nodCrt; nodCrt =   tata[nodCrt])
      {
        capacitate[tata[nodCrt]][nodCrt] -= capMinima;
        capacitate[nodCrt][tata[nodCrt]] += capMinima;
      }

      maxFlow += capMinima;
    }
  }

  out << maxFlow << '\n';

  return 0;
}