Cod sursa(job #1970160)

Utilizator VladTiberiuMihailescu Vlad Tiberiu VladTiberiu Data 18 aprilie 2017 22:59:00
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>

using namespace std;

ifstream w("maxflow.in");
ofstream g("maxflow.out");

const int NMax = 1003;
const int INF = 0x3f3f3f3f;

int n,m,e,x,y,fm,F;
bool viz[NMax];
int tata[NMax];
int c[NMax][NMax],f[NMax][NMax];
vector<int> G[NMax];
queue<int> q;

int bfs(){
    memset(viz,0,sizeof(viz));

    viz[1] = 1;
    q.push(1);
    while(!q.empty()){
        int nod = q.front();
        q.pop();
        if(nod == n)
            continue;
        for(int i = 0; i < G[nod].size(); ++i){
            if(!viz[G[nod][i]] && c[nod][G[nod][i]] != f[nod][G[nod][i]]){
                viz[G[nod][i]] = 1;
                tata[G[nod][i]] = nod;
                q.push(G[nod][i]);
            }
        }
    }
    return viz[n];
}

int main(){
    w >> n >> m;
    for(int i = 1; i <= m; ++i){
        w >> x >> y >> e;
        c[x][y] = e;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    while(bfs()){
        for(int i = 0; i < G[n].size(); ++i){
            if(!viz[G[n][i]] || c[G[n][i]][n] == f[G[n][i]][n])
                continue;

            tata[n] = G[n][i];

            fm = INF;
            for(int nod = n; nod != 1; nod = tata[nod]){
                fm = min(fm,c[tata[nod]][nod] - f[tata[nod]][nod]);
            }
            for(int nod = n; nod != 1; nod = tata[nod]){
                f[tata[nod]][nod] += fm;
                f[nod][tata[nod]] -= fm;
            }

            F += fm;
        }
    }
    g << F << '\n';
}