Cod sursa(job #2467370)

Utilizator TheSeekerRobert Cristian Dobra TheSeeker Data 4 octombrie 2019 09:49:59
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <vector>
#include <deque>
#define DIM 1010
using namespace std;

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

int n,m,i,x,y,z,flux,node,minim,C[DIM][DIM],ok[DIM],T[DIM],F[DIM][DIM];
vector< int > L[DIM];
deque< int > q;

int bfs(){
    int found=0;
    int aux;
    ok[1]=1;
    for (i=2;i<=n;i++)
        ok[i]=0;
    q.push_back(1);
    while (!q.empty()){
        node=q.front();
        for (i=0;i<L[node].size();i++){
            aux=L[node][i];
            if (!ok[aux] && C[node][aux] > F[node][aux]){
                ok[aux]=1;
                q.push_back(aux);
                T[aux]=node;
                if (aux==n)
                    found=1;
            }
        }
        q.pop_front();
    }
    return found;
}

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;
    }
    while (bfs())
        for (i=0;i<L[n].size();i++){
            x=L[n][i];
            if (C[x][n] > F[x][n] && ok[x]){
                minim=C[x][n]-F[x][n];
                y=x;
                while (T[y]){
                    minim=min(minim,C[T[y]][y]-F[T[y]][y]);
                    y=T[y];
                }
                flux+=minim;
                F[x][n]+=minim;
                F[n][x]-=minim;
                y=x;
                while (T[y]){
                    F[T[y]][y]+=minim;
                    F[y][T[y]]-=minim;
                    y=T[y];
                }
            }
        }
    fout<<flux;
    fin.close();
    fout.close();
    return 0;
}