Cod sursa(job #2209203)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 2 iunie 2018 12:19:34
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 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,frunza;
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()) {
        for (int i=0; i<L[n].size(); i++) {
            frunza = L[n][i]; /// exista sigur, eventual pe muchia pusa invers in graful rezidual
            /// fac 2 parcurgeri ale vectorului de tati;
            if (c[frunza][n] <= f[frunza][n])
                continue;


            dif = c[frunza][n] - f[frunza][n];
            x = frunza;
            while (t[x] != 0){

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

    return 0;
}