Cod sursa(job #2753015)

Utilizator Razvan48Capatina Razvan Nicolae Razvan48 Data 20 mai 2021 18:30:22
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <climits>

#include <iostream>

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;

void dfs(int nod)
{
  if (nod == n)
  {
    lantGasit = true;

    return;
  }

  for (auto& vecin : graf[nod])
  {
    if (tata[vecin] == 0 && capacitate[nod][vecin] > 0)
    {
      tata[vecin] = nod;

      dfs(vecin);

      if (lantGasit)
      {
        return;
      }
    }
  }
}

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)
  {
    lantGasit = false;
    memset(tata, 0, sizeof(tata));
    tata[1] = 1;

    dfs(1);

    if (!lantGasit)
      break;

    int capMinima = INT_MAX;
    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;
}