Cod sursa(job #2135681)

Utilizator flaviu_2001Craciun Ioan-Flaviu flaviu_2001 Data 19 februarie 2018 01:18:19
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <bits/stdc++.h>

using namespace std;

int n, m, c[1005][1005], f[1005][1005], p[1005];
bool ok[1005];
vector<int> v[1005];

bool bfs()
{
    queue<int> q;
    memset(ok, 0, sizeof(ok));
    q.push(1);
    ok[1] = 1;
    bool finish = false;
    while(!q.empty()){
        int k = q.front();
        q.pop();
        for (vector<int>::iterator it = v[k].begin(); it != v[k].end(); ++it)
            if(!ok[*it] && c[k][*it] != f[k][*it]){
                ok[*it] = 1;
                p[*it] = k;
                q.push(*it);
                if(*it == n)
                    finish = 1;
            }
    }
    return finish;
}

int main()
{
    ifstream fin ("maxflow.in");
    ofstream fout ("maxflow.out");
    fin >> n >> m;
    while(m--){
        int x, y, C;
        fin >> x >> y >> C;
        v[x].push_back(y);
        v[y].push_back(x);
        c[x][y] = C;
    }
    int flow = 0;
    while(bfs())
        for (vector<int>::iterator it = v[n].begin(); it != v[n].end(); ++it)
            if(ok[*it] && f[*it][n] != c[*it][n]){
                p[n] = *it;
                int nod = n, mn = 2000000000;
                while(nod != 1){
                    mn = min(mn, c[p[nod]][nod]-f[p[nod]][nod]);
                    nod = p[nod];
                }
                if(mn == 0)
                    continue;
                nod = n;
                while(nod != 1){
                    f[p[nod]][nod] += mn;
                    f[nod][p[nod]] -= mn;
                    nod = p[nod];
                }
                flow += mn;
            }
    fout << flow << "\n";
    return 0;
}