Cod sursa(job #1829275)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 14 decembrie 2016 18:52:45
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 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];
vector<int> invn;
int n, m;
int viz[1000];
int st[1000];
int lst, rst;

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);
        v[b].push_back(a);
        mat[a][b] = c;
    }
    while(true)
    {
        for(i = 0; i < n; i++)
            viz[i] = -2;
        viz[0] = -1;
        st[0] = 0;
        lst = 1;
        rst = 0;
        while(lst != rst)
        {
            r = st[rst];
            rst++;
            if(r == n - 1)
                continue;
            for(i = 0; i < v[r].size(); i++)
            {
                if(viz[v[r][i]] == -2 && mat[r][v[r][i]] != rez[r][v[r][i]])
                {
                    viz[v[r][i]] = r;
                    st[lst++] = v[r][i];
                }
            }
        }
        if(viz[n - 1] == -2)
            break;
        for(i = 0; i < v[n - 1].size(); i++)
        {
            if(viz[v[n - 1][i]] != -2)
            {
                a = v[n - 1][i];
                b = inf;
                while(viz[a] != -1)
                {
                    b = min(b, mat[viz[a]][a] - rez[viz[a]][a]);
                    a = viz[a];
                }
                a = v[n - 1][i];
                while(viz[a] != -1)
                {
                    rez[a][viz[a]] -= b;
                    rez[viz[a]][a] += b;
                    a = viz[a];
                }
            }
        }

    }
    c = 0;
    for(i = 0; i < v[0].size(); i++)
    {
        c += rez[0][v[0][i]];
    }
    printf("%d", c);
    return 0;
}