Cod sursa(job #2908740)

Utilizator vladburacBurac Vlad vladburac Data 5 iunie 2022 15:21:14
Problema Flux maxim Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int NMAX = 1000;

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

pair <int, int> edges[NMAX+1][NMAX+1];

int source, dest;
bool viz[NMAX+1];
int parent[NMAX+1];
int n;

void dfs( int node ) {
  int i;
  viz[node] = true;
  if( node != dest ) {
    for( i = 1; i <= n; i++ ) {
      if( !viz[i] && edges[node][i].first != edges[node][i].second ) {
        dfs( i );
        parent[i] = node;
      }
    }
  }
}
signed main() {
  int m, a, b, c, in, out, node, mini, val, flow, i, j;
  fin >> n >> m;
  for( i = 0; i < m; i++ ) {
    fin >> a >> b >> c;
    edges[a][b] = { 0, c };
    edges[b][a] = { -1, -1 };
  }
  for( i = 1; i <= n; i++ ) {
    in = out = 0;
    for( j = 1; j <= n; j++ ) {
      if( edges[i][j].second > 0 )
        out++;
      else if( edges[i][j].second < 0 )
        in++;
    }
    if( in == 0 )
      source = i;
    if( out == 0 )
      dest = i;
  }
  dfs( source );
  flow = 0;
  while( viz[dest] == true ) {
    node = dest;
    mini = 1e9;
    while( node != source ) {
      if( edges[parent[node]][node].first < 0 )
        val = - edges[parent[node]][node].first - 1;
      else
        val = edges[parent[node]][node].second - edges[parent[node]][node].first;
      node = parent[node];
      mini = min( mini, val );
    }
    node = dest;
    while( node != source ) {
      edges[parent[node]][node].first += mini;
      edges[node][parent[node]].first -= mini;
      node = parent[node];
    }
    flow += mini;
    for( i = 1; i <= n; i++ ) {
      viz[i] = false;
      parent[i] = 0;
    }
    dfs( source );
  }
  fout << flow;
  return 0;
}