Cod sursa(job #1379081)

Utilizator lacraruraduRadu Matei Lacraru lacraruradu Data 6 martie 2015 16:11:35
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <fstream>
#include <queue>

#define INF 2147483647
#define N 1001
#define M 5001
using namespace std;

ifstream in("maxflow.in");
ofstream out("maxflow.out");

int n, m;
int flux = 0;
int t[N];
int c[N][N], f[N][N];
int S, D;

int lst[N], vf[2 * M], urm[2 * M], nvf = 0;

queue<int> q;

inline bool bf(int x)
{
    bool ok = 0;

    for(int i = 1; i <= n; i++)
        t[i] = 0;
    t[x] = -1;
    q.push(x);

    while(!q.empty())
    {
        x = q.front();
        q.pop();

        for(int i = lst[x]; i; i = urm[i])
        {
            int y = vf[i];

            if(!t[y] && c[x][y] > f[x][y])
                if(y != D)
                {
                    t[y] = x;
                    q.push(y);
                }
                else
                    ok = 1;
        }
    }
    return ok;
}

inline void dinic()
{
    for(bool ok = bf(S); ok; ok = bf(S))
    {
        for(int i = lst[D]; i; i = urm[i])
        {
            int y = vf[i];

            if(t[y] && c[y][D] > f[y][D])
            {
                t[D] = y;
                int minim = INF;

                for(int x = D; x != 1; x = t[x])
                    if(minim > c[t[x]][x] - f[t[x]][x])
                        minim = c[t[x]][x] - f[t[x]][x];

                if(minim <= 0)
                    continue;

                flux += minim;

                for(int x = D; x != 1; x = t[x])
                {
                    f[t[x]][x] += minim;
                    f[x][t[x]] -= minim;
                }
            }
        }
    }
}

int main()
{
    in >> n >> m;

    for(int i = 1; i <= m; i++)
    {
        int x, y;
        in >> x >> y;
        in >> c[x][y];

        vf[++nvf] = y;
        urm[nvf] = lst[x];
        lst[x] = nvf;
        vf[++nvf] = x;
        urm[nvf] = lst[y];
        lst[y] = nvf;
    }

    S = 1;
    D = n;
    dinic();

    out << flux << '\n';
    return 0;
}