Cod sursa(job #1884888)

Utilizator antanaAntonia Boca antana Data 19 februarie 2017 14:05:48
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>

#define MAXN 1001
#define MAXM 5001
#define INF 0x3f3f3f3f

using namespace std;

vector <int> G[MAXN];

int q[MAXN], n, m, capacity[MAXN][MAXN], flow[MAXN][MAXN], dad[MAXN];
bool seen[MAXN];

inline bool bfs()
{
    int left = 0, right = 0, i, node, son;

    memset(seen, 0, sizeof seen);

    q[right++] = 1;

    while(left < right)
    {
        node = q[left++];

        if(node == n) continue;

        for(i=0; i<G[node].size(); ++i)
        {
            son = G[node][i];
            if(!seen[son] && flow[node][son] < capacity[node][son])
            {
                dad[son] = node;
                seen[son] = 1;
                q[right++] = son;
            }
        }
    }

    return seen[n];
}



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

    int ans = 0, i, x, y, z, node, son, minflow;

    scanf("%d%d", &n, &m);

    for(i=1; i<=m; ++i)
    {
        scanf("%d%d%d", &x, &y, &z);
        capacity[x][y] = z;
        G[x].push_back(y);
        G[y].push_back(x);
    }

    while(bfs())
    {
        for(i=0; i<G[n].size(); ++i)
        {
            son = G[n][i];
            if(seen[son] && flow[son][n] < capacity[son][n])
            {
                dad[n] = son;
                minflow = INF;
                for(node=n; node!=1; node=dad[node])
                {
                    son = dad[node];
                    minflow = min(minflow, capacity[son][node] - flow[son][node]);
                }

                if(minflow != 0)
                {
                    for(node=n; node!=1; node=dad[node])
                    {
                        son = dad[node];
                        flow[son][node] += minflow;
                        flow[node][son] -= minflow;
                    }
                }

                ans += minflow;
            }
        }
    }

    printf("%d", ans);

    return 0;
}