Cod sursa(job #1589327)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 3 februarie 2016 21:57:28
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>
#include <iostream>
#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(vector <int>::iterator it = v[node].begin();it!=v[node].end();it++)
            if(!viz[*it] && C[node][*it] > F[node][*it]){
                viz[*it] = 1;
                T[*it]=node;
                Q.push(*it);
            }
    }

    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(vector <int>::iterator it=v[N].begin();it!=v[N].end();it++)
            if(F[*it][N]<C[*it][N] && viz[*it]!=0){
                int D = *it;
                int minim = C[*it][N] - F[*it][N];
                while(T[D]!=0){
                    if(minim > C[T[D]][D] - F[T[D]][D]){
                        minim = C[T[D]][D] - F[T[D]][D];
                    }
                    D = T[D];
                }

                flux += minim;

                D = *it;

                F[D][N] += minim;
                F[N][D] -= minim;

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

    fout << flux << "\n";


}