Cod sursa(job #1759447)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 19 septembrie 2016 10:49:07
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>

using namespace std;

#define FILE_IO

int N, M;
int h[1005], e[1005];
int fl[1005][1005];
int cp[1005][1005];
vector <int> edg[1005];

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

    scanf("%d%d", &N, &M);
    for(int i = 1; i <= M; i++)
    {
        int x, y, cap;
        scanf("%d%d%d", &x, &y, &cap);
        cp[x][y] = cap;
        cp[y][x] = 0;
        edg[x].push_back(y);
        edg[y].push_back(x);
    }

    for(auto nxt: edg[1])
    {
        e[nxt] = cp[1][nxt];
        fl[1][nxt] = cp[1][nxt];
        cp[nxt][1] = cp[1][nxt];
        cp[1][nxt] = 0;
    }
    h[1] = N;

    int ok = 1;
    while(ok)
    {
        ok = 0;
        for(int i = 2; i < N; i++)
            if(e[i] > 0)
            {
                for(auto nxt: edg[i])
                    if(h[i] == h[nxt] + 1 && cp[i][nxt] != 0)
                    {
                        int psh = min(e[i], cp[i][nxt]);
                        cp[i][nxt] -= psh;
                        cp[nxt][i] += psh;
                        e[i] -= psh;
                        e[nxt] += psh;
                        ok = 1;
                    }
                if(ok)  break;
            }

        if(ok)  continue;

        for(int i = 2; i < N; i++)
            if(e[i] > 0)
            {
                int hmin = 2 * N;
                for(auto nxt: edg[i])
                    if(cp[i][nxt] > 0)
                        hmin = min(hmin, h[nxt]);
                h[i] = hmin + 1;
                ok = 1;
                break;
            }
    }

    printf("%d\n", e[N]);

    return 0;
}