Cod sursa(job #2960559)

Utilizator razvan1403razvan razvan1403 Data 4 ianuarie 2023 17:35:51
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.98 kb
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define l long
#define d double
#define in int
#define si(x) scanf('%d', &x)
#define sl(x) scanf('%lld', &x)
#define ss(s) scanf('%s', s) 
#define pi(x) printf('%d', x)
#define pl(x) printf('%lld', x)
#define ps(s) printf('%s', s) 
#define pb push_back 
#define mp make_pair 
#define F first 
#define S second 
#define all(x) x.begin(), x.end() 
#define clr(x) memset(x, 0, sizeof(x))
#define sortall(x) sort(all(x)) 
typedef pair<int, int> pii; 
typedef pair<ll, ll> pl; 
typedef vector<int> vi; 
typedef vector<ll> vl; 
#define modulo 1000000007
#define FOR(i,a,b) for(int i=a;i<=b;i++)
typedef vector<pii> vpii;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n,m;
int x,y,cost;
vector<vector<int>> graf;
vector<vector<int>> capacitate;
vector<vector<int>> flux;
vector<int> nod_flux;
vector<int> vizitat;
int start, finish;
long long fluxCurent;
long long fluxTotal = 0;

int bfs(){
  vizitat = vector<int> (n+ 1, 0);
  queue<int> Coada;
  Coada.push(start);
  vizitat[start] = 1;
  while(!Coada.empty()){
    int nod_curent = Coada.front();
    Coada.pop();
    for(int i=0;i<graf[nod_curent].size();i++){
      int nod_urmator = graf[nod_curent][i];
      if(vizitat[nod_urmator] == 0)
      {
        if(capacitate[nod_curent][nod_urmator] - flux[nod_curent][nod_urmator] > 0){
          vizitat[nod_urmator] = 1;
          nod_flux[nod_urmator] = nod_curent;
          Coada.push(nod_urmator);
          if(nod_urmator == finish)
            return true;
        }
      }
    }
  }
  return false;
}

void solve(){
  while(bfs()){
    for(int i = 0;i<graf[n].size();i++){
      int nextNode = graf[n][i];
      if(!vizitat[nextNode])
        continue;
      if(capacitate[nextNode][n] - flux[nextNode][n] <= 0) // avem prea mult flux pentru muchia curenta
        continue;
      nod_flux[n] = nextNode;
      fluxCurent = INT_MAX;
      for(int i = n ; i!= 1;i = nod_flux[i]){
        if(capacitate[nod_flux[i]][i] - flux[nod_flux[i]][i] < fluxCurent)
          fluxCurent = capacitate[nod_flux[i]][i] - flux[nod_flux[i]][i];
      }

      for(int i= n;i != 1; i = nod_flux[i]){
        flux[nod_flux[i]][i] = flux[nod_flux[i]][i] + fluxCurent;
        flux[i][nod_flux[i]] = flux[i][nod_flux[i]] - fluxCurent;
      }
      fluxTotal = fluxTotal + fluxCurent;
    }
  }
  fout<<fluxTotal;
  fin.close();
  fout.close();
}

void read(){
  fin>>n>>m; 
  start = 1;
  finish = n;
  graf = vector<vector<int>> (n+1);
  capacitate = vector<vector<int>> (n+1, vector<int> (n+1, 0));
  flux = vector<vector<int>> (n+1, vector<int> (n+1, 0));
  nod_flux = vector<int>(n+1, 0);
  for(int i=0;i<m;i++){
    fin>>x>>y>>cost;
    graf[x].push_back(y);
    graf[y].push_back(x);
    capacitate[x][y] = cost;
  }
  solve();
}

int main() 
{
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  int t = 1;

  while(t--){
    read();
  }

  return 0;
}