Cod sursa(job #2253682)

Utilizator akumariaPatrascanu Andra-Maria akumaria Data 4 octombrie 2018 11:44:20
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include <cstdio>
#include <cstring>
#include <vector>

#define MAXN 1002

using namespace std;

int n, m;

vector<int> arcs[MAXN];
int caps[MAXN][MAXN];
int flow[MAXN][MAXN];

bool viz[MAXN];
int path[MAXN];
int parents[MAXN];


int breadthfirst()
{
    int i, j, curr_node, next_node;
    path[0] = path[1] = 1;
    memset(viz, 0, sizeof(viz));
    viz[1] = 1;

    for(i=1; i<=path[0]; ++i)
    {
        curr_node = path[i];
        if (curr_node == n)
            continue;

        for(j=0; j<arcs[curr_node].size(); ++j)
        {
            next_node = arcs[curr_node][j];
            if(caps[curr_node][next_node] == flow[curr_node][next_node] || viz[next_node])
                continue;

            viz[next_node] = 1;
            path [++path[0]] = next_node;
            parents[next_node] = curr_node;
        }
    }

    return viz[n];
}


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

    int i ,j, x, y, maxflow = 0, curr_node, fmin;
    scanf("%d%d", &n, &m);

    for(i=0; i<m; ++i)
    {
        scanf("%d%d%d", &x, &y, &j);
        arcs[x].push_back(y);
        arcs[y].push_back(x);
        caps[x][y] += j;
    }

    while(breadthfirst())
    {
        for(i=0; i<arcs[n].size(); ++i)
        {
            curr_node = arcs[n][i];
            if(flow[curr_node][n] == caps[curr_node][n] || viz[curr_node] == 0)
                continue;

            parents[n] = curr_node;
            fmin = -1;

            for(j=n; j>1; j=parents[j])
                if(fmin == -1 || fmin > caps[parents[j]][j] - flow[parents[j]][j])
                    fmin = caps[parents[j]][j] - flow[parents[j]][j];

            if (fmin)
                for(j=n; j>1; j = parents[j])
                {
                    flow[parents[j]][j] += fmin;
                    flow[j][parents[j]] -= fmin;
                }

            maxflow = maxflow + fmin;
        }
    }

    printf("%d\n", maxflow);

    fclose(stdin);
    fclose(stdout);
    return 0;
}