Cod sursa(job #2754721)

Utilizator kywyPApescu tiGEriu kywy Data 26 mai 2021 13:30:07
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <bits/stdc++.h>
 
using namespace std;
 
#define int long long
 
ifstream in("maxflow.in");
ofstream out("maxflow.out");
 
const int inf = (int)1e18 + 5;
const int max_n = (int)1e3 + 5;
 
int n, m;
 
int r[max_n][max_n];
 
vector<int> g[max_n];
 
bool visited[max_n];
 
int lvl[max_n];
 
bool bfs() 
{
  for (int i = 1; i <= n; ++i) 
  {
    visited[i] = false;
  }
  queue<int> q;
  visited[1] = true;
  q.push(1);
  lvl[1] = 1;
  while ((int)q.size() > 0) 
  {
    int u = q.front();
    q.pop();
    for (int v : g[u]) 
    {
      if (!visited[v]) 
      {
        if (r[u][v] > 0) 
        {
          q.push(v);
          visited[v] = true;
          lvl[v] = 1 + lvl[u];
        }
      }
    }
  }
  return visited[n];
}
 
int dfs(int u, int flow) 
{
  if (u == n) 
  {
    return flow;
  }
  for (int v : g[u]) 
  {
    if (!visited[v]) 
    {
      if (r[u][v] > 0 && lvl[v] == 1 + lvl[u]) 
      {
        int res = dfs(v, min(flow, r[u][v]));
        if (res > 0) {
          r[u][v] -= res;
          r[v][u] += res;
          return res;
        } 
        else 
        {
          visited[v] = true;
        }
      }
    }
  }
  return 0;
}
 
int main() 
{
    in >> n >> m;
    for (int i = 1; i <= m; ++i)
    {
        int u, v, c;
        in >> u >> v >> c;
        r[u][v] += c;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    int flow = 0;
    while (bfs() == true)
    {
        int pmp;
        fill(visited + 1, visited + n + 1, false);
        while (pmp = dfs(1, inf)) 
        {
            fill(visited + 1, visited + n + 1, false);
            flow += pmp;
        }
    }
    out << flow << "\n";
}