Cod sursa(job #2824575)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 2 ianuarie 2022 18:06:06
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include<fstream>
#include<iostream>
#include<vector>
#include<cstring>
#include<unordered_map>
#include<algorithm>
#include<utility>
using namespace std;

int n,m,k,f,q[50000];
int p[50000];
unordered_map<int, unordered_map<int, int>> cap;
vector<int> g[50000];
bool viz[50000];

bool flow(int s, int d) {
  memset(viz,0,sizeof(viz));
  int l = 1, r = 1;
  viz[s] = 1; q[1] = s; p[s] = s;
  bool ok = 0;

  while (l<=r) {
    int nodc = q[l++];
    for (int i=0; i<g[nodc].size(); ++i)
      if (!viz[g[nodc][i]] && cap[nodc][g[nodc][i]] > 0) {
        if (g[nodc][i] != d) {
          viz[g[nodc][i]] = 1;
          p[g[nodc][i]] = nodc;
          q[++r] = g[nodc][i];
        } else {
          int minc = cap[nodc][g[nodc][i]];
          int aux = nodc;
          while (p[aux] != s) {
            minc = min(minc, cap[p[aux]][aux]);
            aux = p[aux];
          }
          f += minc;
          cap[nodc][g[nodc][i]] -= minc;
          cap[g[nodc][i]][nodc] += minc;
          aux = nodc;
          while (p[aux] != s) {
            cap[p[aux]][aux] -= minc;
            cap[aux][p[aux]] += minc;
            aux = p[aux];
          }

          ok = 1;
        }
      }
  }

  return ok;
}

int main(){
  //ifstream cin("/usr/local/google/home/catavlas/ClionProjects/cf_training/subsecvente.in");
  ifstream cin("maxflow.in");
  ofstream cout("maxflow.out");
  cin>>n>>m;

  for (int i=1; i<=m; ++i) {
    int x, y, z;
    cin>>x>>y>>z;
    g[x].push_back(y);
    g[y].push_back(x);
    cap[x][y] = z;
    cap[y][x] = 0;
  }

  while (flow(1, n)) {}

  cout<<f;

  return 0;
}