Cod sursa(job #1170127)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 12 aprilie 2014 18:27:31
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.18 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stdlib.h>
using namespace std;

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

const int dim = 1005;
const int OO = (1<<31) - 1;
int N, M, source, sink;
int C[dim][dim], F[dim][dim], P[dim], D[dim];

vector <int> V[dim];

void read ()
{
    fi >> N >> M;
    for (int i = 1, x, y, z; i <= M; i++)
    {
        fi >> x >> y >> z;

        C[x][y] = z;

        V[x].push_back (y);
        V[y].push_back (x);
    }
    source = 1;
    sink = N;
}

bool bfs ()
{
    int n, v, i;
    queue <int> Q;

    Q.push (source);

    for (i = 1; i <= N; i++)
    {
        P[i] = 0;
        D[i] = OO;
    }
    P[source] = -1;

    while (!Q.empty())
    {
        n = Q.front ();
        Q.pop ();

        for (i = 0; i < V[n].size(); i++)
        {
            v = V[n][i];

            if (C[n][v] - F[n][v] > 0 && P[v] == 0)
            {
                P[v] = n;
                if (v == sink)
                    return true;
                Q.push (v);
            }
        }
    }
    if (P[sink] != 0)
        return true;
    return false;
}

void edmonds_karp ()
{
    int m, n, p, i, leaf, k=0;
    int flow = 0;

    while (bfs ())
    {
        bool ok = false;
        for (i = 0; i < V[sink].size(); i++)
        {
            leaf = V[sink][i];
            if (P[leaf] == 0)
                continue;

            m = C[leaf][sink] - F[leaf][sink];
            for (n = leaf, p = P[leaf]; n != source; n = P[n], p = P[p])
                m = min (m, C[p][n] - F[p][n]);
            if (m == 0) continue;

            ok = true;

            for (n = leaf, p = P[leaf]; n != source; n = P[n], p = P[p])
            {
                F[p][n] += m;
                F[n][p] -= m;
            }
            F[leaf][sink] += m;
            F[sink][leaf] -= m;
        }
        if (ok == false)
            break;
    }

    for (int i = 0; i < V[source].size(); i++)
    {
        flow += F[source][V[source][i]];
    }
    fo << flow << '\n';
}

int main()
{
    read ();
    edmonds_karp ();
    return 0;
}