Cod sursa(job #1887473)

Utilizator mariakKapros Maria mariak Data 21 februarie 2017 16:53:31
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 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 r[1 + MAX_N][1 + MAX_N];
int deUnde[1 + MAX_N];
vector <int> inD;
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(!r[node][son] || deUnde[son]) continue;
            if(son != D)
                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);
        r[u][v] = capacity;
    }

    int S = 1, D = N, flux = 0;

    for(int u = 1; u <= N; u++) {
     if (r[u][D] > 0)
       inD.push_back(u);
    }


    while(bfs(S, D)) {
    for(int v : inD) {
      if (deUnde[v] != 0) {
        deUnde[D] = v;
        int fDrum = 0x7fffffff;
        int u = D;
        while(u != S) {
          if (fDrum > r[deUnde[u]][u]) {
            fDrum = r[deUnde[u]][u];
          }
          u = deUnde[u];
        }
        u = D;
        while(u != S) {
          r[deUnde[u]][u] -= fDrum;
          r[u][deUnde[u]] += fDrum;
          u = deUnde[u];
        }
        flux += fDrum;
      }
    }
  }
  printf("%d\n", flux);
  return 0;
}