Cod sursa(job #2209202)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 2 iunie 2018 12:11:03
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <vector>
#include <bitset>
#define INF 2000000000
#define DIM 1002
using namespace std;

ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");
int c[DIM][DIM],f[DIM][DIM],Q[DIM],t[DIM];
bitset<DIM> v;
vector <int> L[DIM];
int n,m,i,x,y,z,flux,dif;
int bfs() {
    int p,u;
    v.reset();
    p = u = 1;
    Q[1] = 1;
    v[1] = 1;
    int dest = 0;
    while (p <= u){
        for (int i=0;i<L[ Q[p] ].size();i++){
            int vecin = L[ Q[p] ][i];
            if (v[vecin] == 0 && c[ Q[p] ][vecin] > f[ Q[p] ][vecin]) {
                u++;
                Q[u] = vecin;
                v[vecin] = 1;
                t[vecin] = Q[p];
                if (vecin == n)
                    dest = 1;
            }
        }

        p++;
    }
    return dest;
}

int main (){

    fin>>n>>m;
    for (i=1;i<=m;i++){
        fin>>x>>y>>z;
        L[x].push_back (y);
        L[y].push_back (x);
        c[x][y] = z; /// capacitatea
        /// c[y][x] = 0;
        /// f[x][y] = f[y][x] = 0; initial
    }

    while (bfs()) {
        /// fac 2 parcurgeri ale vectorului de tati;
        x = n;
        dif = INF;
        while (t[x] != 0){

            dif = min (dif,c[t[x]][x]-f[t[x]][x]);
            x = t[x];
        }
        flux += dif;
        /// marim fluxurile
        x = n;
        while (t[x] != 0){
            f[ t[x] ][x] += dif;
            f[x][ t[x] ] -= dif;
            x = t[x];
        }

    }
    fout<<flux;

    return 0;
}