Cod sursa(job #1887478)

Utilizator mirupetPetcan Miruna mirupet Data 21 februarie 2017 16:56:34
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <cstdio>
#include <string.h>
#include <vector>
#include <queue>

const int MAX_N = 1000;

std::vector<int> vecini[1 + MAX_N];
int c[1 + MAX_N][1 + MAX_N];
int deUnde[1 + MAX_N];
std::queue<int> Q;
std :: vector<int> inD;

bool bfs(int S, int D) {
  memset(deUnde, 0, sizeof(deUnde));
  Q.push(S);
  deUnde[S] = S;
  while(!Q.empty()) {
    int node = Q.front();
    Q.pop();
    std :: vector < int > :: iterator son;
    for (son = vecini[node].begin(); son != vecini[node].end(); son ++) {
      if(c[node][*son] == 0 || deUnde[*son]) continue;
      if (*son != D)
        Q.push(*son);
      deUnde[*son] = node;
    }
  }
  return deUnde[D] != 0;
}

int main() {
  freopen("maxflow.in", "r", stdin);
  freopen("maxflow.out", "w", stdout);
  int N, M;
  scanf("%d%d", &N, &M);
  for (int i = 0; i < M; i++)
  {
    int u, v, capacitate;
    scanf("%d%d%d", &u, &v, &capacitate);
    vecini[u].push_back(v);
    vecini[v].push_back(u);
    c[u][v] = capacitate;
  }

  int S = 1;
  int D = N;
  for(int u = 1; u <= N; u++) {
    if (c[u][D] > 0)
      inD.push_back(u);
  }
  int flux = 0;
  while(bfs(S, D)) {


    std :: vector < int > :: iterator v;
    for (v = inD.begin(); v != inD.end(); v ++){
      if (deUnde[*v] != 0) {
        deUnde[D] = *v;
        int fDrum = 0x7fffffff;
        int u = D;
        while(u != S) {
          if (fDrum > c[deUnde[u]][u]) {
            fDrum = c[deUnde[u]][u];
          }
          u = deUnde[u];
        }
        u = D;
        while(u != S) {
          c[deUnde[u]][u] -= fDrum;
          c[u][deUnde[u]] += fDrum;
          u = deUnde[u];
        }
        flux += fDrum;
      }
    }
  }
  printf("%d\n", flux);
  return 0;
}