Cod sursa(job #1589259)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 3 februarie 2016 21:19:13
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
#define DIM 1010

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

int N,M,flux;

vector <int> v[DIM];

int C[DIM][DIM], F[DIM][DIM];
bitset <DIM> viz;
int T[DIM];

queue <int> Q;

int bfs(){

    viz.reset();
    Q.push(1);
    viz[1] = 1;

    while(!Q.empty()){

        int node = Q.front();
        Q.pop();

        for(int i=0;i<v[node].size();i++){
            int vec = v[node][i];
            if(!viz[vec] && F[node][vec] < C[node][vec]){
                viz[vec] = 1;
                T[vec] = node;
                Q.push(vec);
            }

        }
    }

    return viz[N];
}

int main(){

    fin >> N >> M;

    while(M--){
        int x,y,z;
        fin >> x >> y >> z;
        v[x].push_back(y);
        v[y].push_back(x);
        C[x][y] = z;
    }

    while(bfs())
        for(int i=0;i<v[N].size();i++){
            int minim = 0x3f3f3f3f;
            int D = v[N][i];
            if(F[D][N] == C[D][N] || !viz[D])
                continue;
            T[N] = D;
            while(D!=1){
                if(minim > C[T[D]][D] - F[T[D]][D])
                    minim = C[T[D]][D] - F[T[D]][D];
                D=T[D];
            }

            D = N;
            flux += minim;

            while(D!=1){
                F[T[D]][D] += minim;
                F[D][T[D]] -= minim;
                D=T[D];
            }

        }

    fout << flux << "\n";

}