Cod sursa(job #999746)

Utilizator radustn92Radu Stancu radustn92 Data 21 septembrie 2013 12:55:59
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.61 kb
#include <cstdio>
#include <bitset>
#include <vector>
#include <algorithm>
#define pb push_back
#define pii pair <int, int>
#define NMAX 1005
#define INF 1000000000
using namespace std;
int n, m, F[NMAX][NMAX], C[NMAX][NMAX], dad[NMAX], Q[NMAX], flow, D[NMAX], best[NMAX];
int source, dest;
vector <int> G[NMAX];
bitset <NMAX> vis;

int BF()
{
    int i, j, node, x;
    vis.reset();
    Q[Q[0] = 1] = source; D[source] = 0;
    
    for (i = 1; i <= Q[0]; i++)
    {
        node = Q[i];
        if (node == dest)
            continue ;
            
        for (j = 0; j < (int)G[node].size(); j++)
        {
            x = G[node][j];
            if (!vis[x] && F[node][x] < C[node][x])
            {
                Q[++Q[0]] = x; vis[x] = 1; 
                D[x] = D[node] + 1;
            }
        }
    }
    if (!vis[dest])
        return 0;
    
    vis.reset();
    Q[Q[0] = 1] = source; vis[source] = 1; best[source] = INF;
    for (i = 1; i <= Q[0]; i++)
    {
        node = Q[i];
        if (node == dest)
            continue ;
            
        for (j = 0; j < (int)G[node].size(); j++)
        {
            x = G[node][j];
            if (D[x] == D[node] + 1 && best[x] < min(best[node], C[node][x] - F[node][x]))
            {
                best[x] = min(best[node], C[node][x] - F[node][x]); dad[x] = node;
                if (!vis[x])
                    Q[++Q[0]] = x, vis[x] = 1;
            }
        }
    }
    
    return vis[dest];
}

void max_flow()
{
    int i, node, child, fmin;
    while (BF())
    {
        for (i = 0; i < (int)G[dest].size(); i++)
        {
            child = G[dest][i];
            if (vis[child] && F[child][dest] < C[child][dest])
            {
                fmin = INF; dad[dest] = child;
                for (node = dest; node != source; node = dad[node])
                    fmin = min(fmin, C[dad[node]][node] - F[dad[node]][node]);
                
                for (node = dest; node != source; node = dad[node])
                {
                    F[dad[node]][node] += fmin;
                    F[node][dad[node]] -= fmin;
                }
                
                flow += fmin;
            }
        }
    }
}

int main()
{
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);
    scanf("%d%d", &n, &m);
    int i, x, y, z;
    for (i = 1; i <= m; i++)
    {
        scanf("%d%d%d", &x, &y, &z);
        G[x].pb(y); C[x][y] = z;
        G[y].pb(x);
    }
    
    source = 1; dest = n;
    max_flow();
    
    printf("%d\n", flow);
    return 0;
}