Cod sursa(job #3344607)

Utilizator andrei0925Andrei Perdevara andrei0925 Data 3 martie 2026 20:21:02
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>

#define INF 1e9
#define NMAX 1005

using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");

int N, M, a, b, c, C[NMAX][NMAX], parent[NMAX], F[NMAX][NMAX], S, T;
vector <int> G[NMAX];
queue <int> q;

bool bfs()
{
  memset(parent, 0, sizeof(parent));
  queue <int> q;

  parent[S] = -1;
  q.push(S);
  while(q.size())
  {
    int acc = q.front();
    q.pop();

    if(acc == T) return true;

    for(auto e : G[acc])
    {
      if(parent[e] == 0 and C[acc][e] - F[acc][e] > 0)
      {
        parent[e] = acc;
        q.push(e);
      }
    }
  }
  return false;
}

int main()
{
  cin >> N >> M;
  S = 1;
  T = N;

  for(int i = 1; i <= M; i++)
  {
    cin >> a >> b >> c;
    G[a].push_back(b);
    G[b].push_back(a);
    C[a][b] = c;
  }

  long long max_flow = 0;
  while(bfs())
  {
    for(auto e : G[T])
    {
      if(parent[e] and C[e][T] - F[e][T] > 0)
      {
        //gasim bottleneck-ul
        int bottle_neck = INF;
        parent[T] = e;
        int acc = T;
        while(acc != S)
        {
          int prev = parent[acc];
          bottle_neck = min(bottle_neck, C[prev][acc] - F[prev][acc]);
          acc = prev;
        }

        //modificam flow-urile arcelor
        acc = T;
        while(acc != S)
        {
          int prev = parent[acc];
          F[prev][acc] += bottle_neck;
          F[acc][prev] -= bottle_neck;
          acc = prev;
        }
        max_flow += bottle_neck;
      }
    }
  }
  cout << max_flow;
  return 0;
}