Cod sursa(job #1887417)

Utilizator mariakKapros Maria mariak Data 21 februarie 2017 16:23:32
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>

FILE *fin  = freopen("maxflow.in", "r", stdin);
FILE *fout = freopen("maxflow.out", "w", stdout);

using namespace std;

const int MAX_N = 1000;

vector <int> vecini[1 + MAX_N];
int c[1 + MAX_N][1 + MAX_N];
int f[1 + MAX_N][1 + MAX_N];
int deUnde[1 + MAX_N];
queue <int> Q;

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();
        for(int son : vecini[node])
        {
            if(c[node][son] == f[node][son] || deUnde[son]) continue;
            Q.push(son);
            deUnde[son] = node;
        }
    }
    return deUnde[D] != 0;
}

int main()
{
    int N, M, u, v, capacity;
    scanf("%d %d", &N, &M);
    for (int i = 0; i < M; i++){
        scanf("%d %d %d", &u, &v, &capacity);
        vecini[u].push_back(v);
        vecini[v].push_back(u); // A nu se uita!!!!
        c[u][v] = capacity;
    }

    int S = 1, D = N, flux = 0;
    while(bfs(S, D)) {
    int fDrum = 0x7fffffff;
    int u = D;
    while(deUnde[u] != u) {
      if (fDrum > c[deUnde[u]][u] - f[deUnde[u]][u]) {
        fDrum = c[deUnde[u]][u] - f[deUnde[u]][u];
      }
      u = deUnde[u];
    }
    u = D;
    while(deUnde[u] != u) {
      f[deUnde[u]][u] += fDrum;
      f[u][deUnde[u]] -= fDrum;
      u = deUnde[u];
    }
    flux += fDrum;
  }
  printf("%d\n", flux);
  return 0;
}