Cod sursa(job #2154886)

Utilizator vladttturcuman vlad vladtt Data 7 martie 2018 13:23:37
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <bits/stdc++.h>

#define ll long long
#define ld long double
#define pii pair<int,int>
#define fs first
#define sc second
#define pb push_back
#define NMax 1001
#define oo 1000000000
#define MOD 1000000007

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

using namespace std;

IOFile

vector<int> G[NMax];
vector<int> G2[NMax];
vector<pii> E;

int dist[NMax];

int n,m,a,b,c;
int Flow;

bool BFS(){
    queue<int> q;
    for(int i=1;i<=n;i++) G2[i].clear();
    memset(dist,0,sizeof(dist));
    dist[1] = 1;
    q.push(1);
    while(q.size()){
        int node = q.front(); q.pop();
        if(node == n) return 1;
        for(auto it:G[node]){
            if(!E[it].sc) continue;
            if(!dist[E[it].fs]) dist[E[it].fs] = dist[node]+1, q.push(E[it].fs);
            if(dist[E[it].fs] == dist[node] + 1) G2[node].push_back(it);
        }
    }
    return 0;
}

int DFS(int node,int c){
    if(node == n) {
        Flow += c;
        return c;
    }
    int Sum = 0;
    for(auto it:G2[node]){
        int F = DFS(E[it].fs, min(c,E[it].sc));
        Sum += F;
        c-=F;
        E[it].sc -= F;
        E[it^1].sc += F;
    }
    return Sum;
}

int main()
{
    fin>>n>>m;
    for(int i=1;i<=m;i++){
        fin>>a>>b>>c;
        G[a].push_back(E.size());
        E.push_back({b,c});
        G[b].push_back(E.size());
        E.push_back({a,0});
    }
    
    while(BFS()) DFS(1,oo);
    
    fout<<Flow<<'\n';;
    return 0;
}