Cod sursa(job #1513885)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 30 octombrie 2015 10:04:35
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.69 kb
#include <cstdio>
#include <deque>
#include <vector>
#include <algorithm>
#include <bitset>

#define DIM 1024
using namespace std;

int nrNodes, nrEdges, node1, node2, cost;

vector <int> Edges[DIM]; int Father[DIM];
bitset <DIM> Marked; deque <int> Queue;
int Quantity[DIM][DIM], maxFlow[DIM][DIM];

bool BFS (int startNode, int finishNode)
{
    Marked.reset();
    Queue.clear();

    int ok = 0;
    Queue.push_back(startNode);
    Marked[startNode] = 1;

    while (!Queue.empty())
    {
        int node = Queue.front();

        vector <int> :: iterator it;
        for (it = Edges[node].begin(); it != Edges[node].end(); it ++)
        {
            int nextNode = *it;

            if (!Marked[nextNode] && maxFlow[node][nextNode] < Quantity[node][nextNode])
            {
                Marked[nextNode] = 1;
                Father[nextNode] = node;
                Queue.push_back(nextNode);

                if (nextNode == finishNode)
                    ok = 1;
            }
        }

        Queue.pop_front();
    }

    return ok;
}

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

    scanf ("%d %d", &nrNodes, &nrEdges);

    for (int i = 1; i <= nrEdges; i ++)
    {
        scanf ("%d %d %d", &node1, &node2, &cost);

        Quantity[node1][node2] = cost;
        Edges[node1].push_back(node2);
        Edges[node2].push_back(node1);
    }

    int sum = 0;
    while ( BFS(1, nrNodes) )
    {
        int node = nrNodes;

        vector <int> :: iterator it;
        for (it = Edges[node].begin(); it != Edges[node].end(); it ++)
        {
            int nextNode = *it;

            if (Marked[nextNode] && maxFlow[nextNode][node] < Quantity[nextNode][node])
            {
                int minim = Quantity[nextNode][node] - maxFlow[nextNode][node], newNode;

                newNode = nextNode;
                while (Father[newNode])
                {
                    minim = min (minim, Quantity[Father[newNode]][newNode] - maxFlow[Father[newNode]][newNode]);
                    newNode = Father[newNode];
                }

                sum += minim;
                maxFlow[nextNode][node] += minim;
                maxFlow[node][nextNode] -= minim;

                newNode = nextNode;
                while (Father[newNode])
                {
                    maxFlow[Father[newNode]][newNode] += minim;
                    maxFlow[newNode][Father[newNode]] -= minim;
                    newNode = Father[newNode];
                }
            }
        }
    }

    printf ("%d\n", sum);

    fclose (stdin );
    fclose (stdout);

    return 0;
}