Cod sursa(job #3137533)

Utilizator iraresmihaiiordache rares mihai iraresmihai Data 13 iunie 2023 10:46:51
Problema Flux maxim Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 kb
#include <iostream>
#include <vector>

using namespace std;

const int MAXN = 1000;
const int MAXM = 5000;
const int NIL = -1;
const int INF = 2e9;

struct info{
  int to, id;
};

std::vector <info> adj[MAXN];
int viz[MAXN];
info prevv[MAXN];
int edgesCap[MAXN * 2];
int edgesCapSize;
int flowSize;

int q[MAXN];
int pq, uq;

bool bfs(){
  int u;

  for( u = 0 ; u < flowSize; u++ )
    viz[u] = false;

  q[0] = 0;
  prevv[0].to = NIL;
  viz[0] = true;

  pq = 0;
  uq = 1;
  while( pq < uq && q[pq] != flowSize - 1 ){
    u = q[pq++];

    for( info v : adj[u] ){
      if( !viz[v.to] && edgesCap[v.id] ) {
        viz[v.to] = true;
        prevv[v.to].to = u;
        prevv[v.to].id = v.id;
        q[uq++] = v.to;
      }
    }
  }

  return viz[flowSize - 1];
}

int makeFlux() {
  int flux, delta, a;

  flux = 0;
  while( bfs() ){
    for( info aux : adj[flowSize - 1] ) {
      prevv[flowSize - 1].to = aux.to;
      prevv[flowSize - 1].id = aux.id ^ 1;

      delta = +INF;
      for( a = flowSize - 1; a; a = prevv[a].to ) {
        delta = min(delta, edgesCap[prevv[a].id]);
      }

      flux += delta;

      for( a = flowSize - 1; a; a = prevv[a].to ) {
        edgesCap[prevv[a].id] -= delta;
        edgesCap[prevv[a].id ^ 1] += delta;
      }
    }
  }

  return flux;
}

void addEdge(int a, int b, int cap) {
  adj[a].push_back({b, edgesCapSize});
  edgesCap[edgesCapSize] = cap;
  edgesCapSize++;
  adj[b].push_back({a, edgesCapSize});
  edgesCap[edgesCapSize] = 0;
  edgesCapSize++;
}

int main(){
  FILE *fin, *fout;
  fin = fopen("maxflow.in", "r");
  fout = fopen("maxflow.out", "w");

  int m, i, a, b, aux;

  fscanf(fin, "%d%d", &flowSize, &m);

  edgesCapSize = 0;
  for( i = 0 ; i < m ; i++ ) {
    fscanf(fin, "%d%d%d", &a, &b, &aux);
    a--;
    b--;

    addEdge(a, b, aux);
  }

  fprintf(fout, "%d\n", makeFlux());

  fclose(fin);
  fclose(fout);

  return 0;
}