Cod sursa(job #3193699)

Utilizator euyoTukanul euyo Data 15 ianuarie 2024 14:22:48
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>

using namespace std;

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

const int DIM = 1005;
const int INF = 1e9;

vector<int> G[DIM];
int cap[DIM][DIM];
int flow[DIM][DIM];
int viz[DIM];

void push_edge( int u, int v, int c ) {
  G[u].push_back(v);
  G[v].push_back(u);
  cap[u][v] += c;
}

int prv[DIM];

int bfs( int s, int d ) {
  queue<int> q;
  for ( int i = 1; i <= d; ++i ) {
    viz[i] = prv[i] = 0;  
  }
  q.push(s);
  viz[s] = 1;
  while ( !q.empty() ) {
	int u = q.front();
	q.pop();

    if ( u == d ) {
	  return 1;
	}

	for ( auto v : G[u] ) {
      if ( !viz[v] && cap[u][v] > flow[u][v] ) {
        prv[v] = u;
		q.push(v);
		viz[v] = 1;
	  }
	}
  }
  return 0;
}

int main() {
  int n, m, u, v, c;

  fin >> n >> m;
  for ( int i = 1; i <= m; ++i ) {
	fin >> u >> v >> c;
	push_edge(u, v, c);
  }
  int res = 0;
  while ( bfs(1, n) ) {
	for ( auto w : G[n] ) {
	  if ( !viz[w] || cap[w][n] <= flow[w][n] ) continue;
	  prv[n] = w;

	  int win = INF;
	  for ( u = n; u != 1; u = prv[u] ) {
	    win = min(win, cap[prv[u]][u] - flow[prv[u]][u]);
	  }
	  if ( win == 0 ) continue;
      for ( u = n; u != 1; u = prv[u] ) {
	    flow[prv[u]][u] += win;
	    flow[u][prv[u]] -= win;
  	  }
	  res += win;
	}
  }
  fout << res;
  fin.close();
  fout.close();
  return 0;
}