Cod sursa(job #2498764)

Utilizator isa_tudor_andreiAndrei Tudor isa_tudor_andrei Data 24 noiembrie 2019 13:00:36
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.24 kb
#include <bits/stdc++.h>

using namespace std;

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

const int INF = 210000;

struct Edge{
  int dest;
  long long f;
  long long c;
  int rev;
};

class Residual_graph {
  int V;
  vector<Edge> *G;
  int *level;
  public:
    Residual_graph( int V ) {
      this->V = V;
      G = new vector<Edge> [V + 1];
      level = new int[V + 1];
    }

    void add_edge( int u, int v, long long capacity ) {
      Edge a{v, 0, capacity, G[v].size()};
      Edge b{u, 0, 0, G[u].size()};

      G[u].push_back(a);
      G[v].push_back(b);
    }

    bool BFS(int source, int sink);
    long long push_flow(int node, int sink, int start[], long long flow);
    long long Dinic(int source, int sink);
};

bool Residual_graph::BFS(int source, int sink) {

  for( int i = 1; i <= V; i ++ )
    level[i] = -1;

  level[source] = 0;
  queue<int> q;
  q.push(source);
  while( !q.empty() ) {
    int node = q.front();
    q.pop();
    for( auto it : G[node] ) {
      if( level[it.dest] == -1 && it.f < it.c ) {
        level[it.dest] = level[node] + 1;
        q.push(it.dest);
      }
    }
  }

  return (level[sink] > 0);
}

long long Residual_graph::push_flow(int node, int sink, int start[], long long flow) {

  if( node == sink )
    return flow;

  for( ; start[node] < G[node].size(); start[node] ++ ) {
    Edge &e = G[node][start[node]];
    if( level[node] + 1 == level[e.dest] && e.f < e.c ) {
      long long tempflow = push_flow(e.dest,sink,start,min(flow, e.c - e.f));
      if( tempflow > 0 ) {
        e.f += tempflow;
        G[e.dest][e.rev].f -= tempflow;
        return tempflow;
      }
    }
  }
  return 0;
}

long long Residual_graph::Dinic( int source, int sink ) {
  long long maxflow = 0;
  while( BFS(source,sink) == true ) {
    int start[V + 1] = {0};
    while( int tempflow = push_flow(source,sink,start,INF) )
      maxflow += tempflow;
  }
  return maxflow;
}

int main() {
    int n, m;
    fin>>n>>m;
    Residual_graph graph(n);
    for( int i = 1; i <= m; i ++ ) {
      int a, b;
      long long cap;
      fin>>a>>b>>cap;
      graph.add_edge(a,b,cap);
    }
    fout<<graph.Dinic(1,n);
    return 0;
}