Pagini recente » Rating Boca Dan-Nicolae (NicuBoca16) | Cod sursa (job #1269638) | Cod sursa (job #1795873) | Cod sursa (job #2867892) | Cod sursa (job #1484288)
#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;
}