Cod sursa(job #1947978)

Utilizator MaarcellKurt Godel Maarcell Data 31 martie 2017 16:10:08
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
using namespace std;

#define fi first
#define se second
typedef long long LL;
typedef long double LD;

int N,M,C[1010][1010],T[1010],F[1010][1010],q[1010],K; bool v[1010];
vector<int> g[1010];

bool bfs(){
    memset(v,0,sizeof(v));
    memset(T,0,sizeof(T));

    K=1,q[1]=1,v[1]=1;
    int i,nod;
    for (i=1; i<=K; i++){
        nod=q[i];
        for (int next : g[nod])
            if (!v[next] && F[nod][next]<C[nod][next]){
                if (next!=N) q[++K]=next;
                v[next]=1;
                T[next]=nod;
            }
    }

    return v[N];
}

int main(){
    ifstream fin("maxflow.in");
    ofstream fout("maxflow.out");
    fin >> N >> M;

    int i,c,x,y;
    for (i=1; i<=M; i++){
        fin >> x >> y >> c;
        g[x].push_back(y);
        C[x][y]+=c;
        g[y].push_back(x);
    }

    int flow=0;
    while (bfs()){
        for (int nd : g[N]){
            if (!v[nd] || F[nd][N]==C[nd][N]) continue;
            T[N]=nd;

            int fmin=(1<<30),nod;
            for (nod=N; nod!=1; nod=T[nod])
                fmin=min(fmin,C[T[nod]][nod]-F[T[nod]][nod]);

            flow+=fmin;
            for (nod=N; nod!=1; nod=T[nod]){
                F[T[nod]][nod]+=fmin;
                F[nod][T[nod]]-=fmin;
            }
        }
    }

    fout << flow << "\n";
    return 0;
}