Cod sursa(job #1484288)

Utilizator DorelBarbuBarbu Dorel DorelBarbu Data 10 septembrie 2015 19:03:36
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

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

const int MAXN = 1000, INF = 2000000000;

int cap[MAXN+1][MAXN+1], numNodes, numEdges, father[MAXN+1], answer;

vector <int> G[MAXN+1];

void readData()
{
    in>>numNodes>>numEdges;

    for(int i = 1; i <= numEdges; i++)
    {
        int nodeX, nodeY, capXY;
        in>>nodeX>>nodeY>>capXY;
        G[ nodeX ].push_back( nodeY );
        cap[ nodeX ][ nodeY ] = capXY;
    }
}

int findFlowIncrease()
{
    int node = numNodes, flowIncrease = INF;

    while( node != 1 )
    {
        int prevNode = father[ node ];
        flowIncrease = min( flowIncrease, cap[ prevNode ][ node ] );
        node = prevNode;
    }

    answer += flowIncrease;

    return flowIncrease;
}

void updateFlow()
{
    int node = numNodes, flowIncrease = findFlowIncrease();

    while( node != 1 )
    {
        int prevNode = father[ node ];
        cap[ prevNode ][ node ] -= flowIncrease;
        cap[ node ][ prevNode ] += flowIncrease;
        node = prevNode;
    }
}



void findAugPaths(int node)
{
    if( node == numNodes )
        updateFlow();


    for(int i = 0; i < G[ node ].size(); i++)
    {
        int nextNode = G[ node ][ i ];

        if( cap[ node ][ nextNode ] > 0 )
        {
            father[ nextNode ] = node;
            findAugPaths( nextNode );
            father[ nextNode ] = 0;
        }
    }
}

int main()
{

    readData();
    findAugPaths(1);
    out<<answer;
    return 0;
}