Cod sursa(job #1827737)

Utilizator antanaAntonia Boca antana Data 12 decembrie 2016 11:21:05
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
#include <cstdio>
#include <vector>
#include <cstring>

#define MAXN 1001
#define INF 0x3f3f3f3f

using namespace std;

vector <int> graf[MAXN];

int k, n, m, flow[MAXN][MAXN], cp[MAXN][MAXN], last[MAXN], q[MAXN];
bool vis[MAXN];

inline int minim(int a, int b){
    return a < b ? a : b;
}

int bfs()
{
    int node, neigh, l, r, i;

    memset(vis, 0, sizeof vis);

    l = r = 1;
    q[1] = 1;
    vis[1] = 1;

    while( l <= r)
    {
        node = q[l++];

        if(node != n)
        {
            for(i=0; i<graf[node].size(); ++i)
            {
                neigh = graf[node][i];
                if(flow[node][neigh] < cp[node][neigh] && !vis[neigh])
                {
                    vis[neigh] = 1;
                    q[++r] = neigh;
                    last[neigh] = node;
                }
            }
        }
    }

    return vis[n];
}


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

    int i, ans = 0, node, neigh, x, y, z, fmin;

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

    for(i=1; i<=m; ++i)
    {
        scanf("%d%d%d", &x, &y, &z);

        graf[x].push_back(y);
        graf[y].push_back(x);
        cp[x][y] = z;
    }

    while(bfs())
    {
        for(i=0; i<graf[n].size(); ++i)
        {
            if(vis[graf[n][i]] && flow[graf[n][i]][n] < cp[graf[n][i]][n])
            {
                node = graf[n][i];
                last[n] = node;
                fmin = INF;

                for(node=n; node!=1; node=last[node])
                {
                    neigh = last[node];
                    fmin = minim(fmin, cp[neigh][node] - flow[neigh][node]);
                }

                if(fmin != 0)
                {
                    for(node=n; node!=1; node=last[node])
                    {
                        neigh = last[node];
                        flow[neigh][node] += fmin;
                        flow[node][neigh] -= fmin;
                    }

                    ans += fmin;
                }
            }
        }
    }

    printf("%d", ans);

    return 0;
}