Cod sursa(job #2492546)

Utilizator MihneaGhiraMihnea MihneaGhira Data 14 noiembrie 2019 21:41:17
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include<fstream>
#include<algorithm>
#include<deque>
#include<vector>
#include<cstring>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n,m,minim,x,y,k,s;
int f[1010],T[1010];
int C[1010][1010],flux[1010][1010];
deque <int> coada;
vector <int> v[1010];

int bfs(){
    memset(f,0,sizeof(f));
    coada.push_back(1);
    f[1]=1;

    while(!coada.empty()){
        int nod=coada.front();
        for(int i=0; i<v[nod].size();i++){
            int vecin=v[nod][i];
            if(f[vecin]==0 && C[nod][vecin]>flux[nod][vecin]){
                coada.push_back(vecin);
                T[vecin]=nod;
                f[vecin]=1;
            }
        }
        coada.pop_front();
    }

    if(f[n]==1){
        return 1;
    }
    else{
        return 0;
    }
}

int main(){
    fin>>n>>m;
    for(int i=1;i<=m;i++){
        fin>>x>>y>>k;
        v[x].push_back(y);
        v[y].push_back(x);
        C[x][y]=k;
    }
    while( bfs() ){

        for(int i=0;i<v[n].size();i++){
            int nod=v[n][i];
            if(f[nod]==1 && C[nod][n]>flux[nod][n]){

                int minim=C[nod][n]-flux[nod][n];
                while(nod!=1){
                    minim=min(minim,C[T[nod]][nod]-flux[T[nod]][nod]);
                    nod=T[nod];
                }
                s+=minim;
                nod=v[n][i];
                flux[nod][n]+=minim;flux[n][nod]-=minim;
                while(nod!=1){
                    flux[T[nod]][nod]+=minim;
                    flux[nod][T[nod]]-=minim;
                    nod=T[nod];
                }
            }
        }
    }
    fout<<s;
    return 0;
}