Cod sursa(job #2308028)

Utilizator DimaTCDima Trubca DimaTC Data 26 decembrie 2018 09:37:18
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include<bits/stdc++.h>
#define N 1005
using namespace std;

const int inf = 2e9;

vector<int> V[N];
int a[N][N];
queue<int> Q;
int viz[N];
int rs, n, m;

bool BFS() {
    for (int i=1; i<=n; i++) viz[i] = -1;
    viz[1] = 0;
    while (Q.size()) Q.pop();
    Q.push(1);
    while (Q.size()) {
        int x = Q.front(); Q.pop();
        for (auto y : V[x]) {
            if (viz[y]==-1 && a[x][y]>0) {
                viz[y]=x;
                Q.push(y);
                if (y == n) return 1;
            }
        }
    }
    return 0;
}

int main() {
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);
    cin>>n>>m;

    for (int i=1; i<=m; i++) {
        int x,y,c; cin>>x>>y>>c;
        V[x].push_back(y);
        V[y].push_back(x);
        a[x][y] += c;
    }

    while (BFS()) {
            for (int j=0; j<V[n].size(); j++) {
                int nod = V[n][j];
                if (viz[nod]==-1) continue;
                viz[n] = nod;
                int pathFlow = inf;
                for (int i=n; i!=1; i=viz[i]) {
                    pathFlow = min(pathFlow, a[viz[i]][i]);
                }

                for (int i=n; i!=1; i=viz[i]) {
                    a[viz[i]][i] -= pathFlow;
                    a[i][viz[i]] += pathFlow;
                }

                rs+=pathFlow;
            }

    }
    cout<<rs;

    return 0;
}