Cod sursa(job #2682457)

Utilizator mihai2003LLL LLL mihai2003 Data 8 decembrie 2020 18:12:46
Problema Flux maxim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <queue>

const int NMAX=1001;

std::ifstream in("maxflow.in");
std::ofstream out("maxflow.out");

int n,m,flux;
int c[NMAX][NMAX];
int f[NMAX][NMAX];
int t[NMAX];

int bfs(int s,int d){
    std::queue<int>q;
    q.push(s);
    std::memset(t,0,sizeof(t));
    t[s]=-1;
    while(!q.empty()){
        int top=q.front();
        q.pop();
        for(int i=1;i<=n;i++)
            if(!t[i] && c[top][i]-f[top][i]>0){
                    q.push(i),t[i]=top;
                if(i==d)return 1;
            }
    }
    return 0;
}

int s,d;

void flux_max(){
    int i,cr;
    for(flux=0;bfs(s,d);flux+=cr){
        cr=1e10;
        i=d;
        while(i!=s)
            cr=std::min(cr,c[t[i]][i]-f[t[i]][i]),i=t[i];
        i=d;
        while(i!=s)
            f[t[i]][i]+=cr,f[i][t[i]]-=cr,i=t[i];
    }
}

int main(){
    in>>n>>m;
    s=1;
    d=n;
    for(int i=1,x,y,z;i<=m;i++){
        in>>x>>y>>z;
        c[x][y]=z;
    }
    flux_max();
    out<<flux;
    return 0;
}