Cod sursa(job #1829253)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 14 decembrie 2016 18:10:26
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <bits/stdc++.h>
#define inf 1000000000

using namespace std;

int mat[1000][1000] = {0};
int rez[1000][1000] = {0};
vector< int > v[1000];
int n, m;
int st[1000];
int par[1000];
int lst;
bool viz[1000] = {0};

int main()
{
    int i, j, a, b, c, r;
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(i = 0; i < m; i++)
    {
        scanf("%d%d%d", &a, &b, &c);
        a--; b--;
        v[a].push_back(b);
        mat[a][b] = c;
    }
    c = 1;
    while(c)
    {
        c = 0;
        r = 0;
        lst = 1;
        st[0] = 0;
        par[0] = -1;
        for(i = 0; i < n; i++)
            viz[i] = false;
        viz[0] = true;
        while(r < lst)
        {
            if(st[r] == n - 1)
            {
                a = inf;
                b = n - 1;
                while(par[b] != -1)
                {
                    a = min(a, mat[par[b]][b] - rez[par[b]][b]);
                    b = par[b];
                }
                if(a != 0)
                {
                    c = 1;
                    b = n - 1;
                    while(par[b] != -1)
                    {
                        rez[par[b]][b] += a;
                        b = par[b];
                    }
                }
            }
            else
            {
                for(i = 0; i < v[st[r]].size(); i++)
                {
                    if(!viz[v[st[r]][i]] && mat[st[r]][v[st[r]][i]] != rez[st[r]][v[st[r]][i]])
                    {
                        if(v[st[r]][i] != n - 1)
                            viz[v[st[r]][i]] = true;
                        par[v[st[r]][i]] = st[r];
                        st[lst++] = v[st[r]][i];
                    }
                }
            }
            r++;
        }
    }
    c = 0;
    for(i = 0; i < v[0].size(); i++)
    {
        c += rez[0][v[0][i]];
    }
    printf("%d", c);
    return 0;
}