Cod sursa(job #3338114)

Utilizator Gerald123Ursan George Gerald123 Data 31 ianuarie 2026 16:08:37
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
/// patratele
#include <bits/stdc++.h>
using namespace std;

#define MOD 1000000003
#define NMAX 1010

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

int i, start = 1, finish, n, m, a, b, c, mat[NMAX][NMAX], niv[NMAX], fr[NMAX], x, ras;
vector<int> v[1010];
queue<int> q;

void bfs(int nod)
{
  for (i = 1; i <= n; i++)
  {
    niv[i] = -1;
    fr[i] = 0;
  }
  niv[1] = 0;
  q.push(nod);
  while (!q.empty())
  {
    int p = q.front();
    q.pop();
    for (auto it : v[p])
    {
      if (niv[it] == -1 && mat[p][it] > 0)
      {
        niv[it] = niv[p] + 1;
        q.push(it);
      }
    }
  }
}

int dfs(int nod, int mini)
{
  if (nod == n || mini == 0)
    return mini;
  while (fr[nod] < v[nod].size())
  {
    int p = v[nod][fr[nod]];
    if (mat[nod][p] > 0 && niv[p] == niv[nod] + 1)
    {
      x = dfs(p, min(mini, mat[nod][p]));
      if (x > 0)
      {
        mat[nod][p] -= x;
        mat[p][nod] += x;
        return x;
      }
    }
    fr[nod]++;
  }
  return 0;
}

bool flux(int nod)
{
  bfs(nod);
  if (niv[n] == -1)
    return 0;
  int val = 0;
  while (1)
  {
    x = dfs(nod, 1e9);
    if (x == 0)
      break;
    val += x;
  }
  ras += val;
  return (val != 0);
}
int main()
{
  // ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  fin >> n >> m;
  for (i = 1; i <= m; i++)
  {
    fin >> a >> b >> c;
    v[a].push_back(b);
    v[b].push_back(a);
    mat[a][b] = c;
  }
  while (flux(start))
    ;
  fout << ras;
}