Pagini recente » Cod sursa (job #3121947) | Cod sursa (job #934784) | Cod sursa (job #2792216) | Cod sursa (job #2334918) | Cod sursa (job #1484355)
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int MAXN = 1000, INF = 2000000000;
int cap[MAXN+1][MAXN+1], numNodes, numEdges, father[MAXN+1], answer;
vector <int> G[MAXN+1];
bool viz[MAXN+1];
void readData()
{
scanf("%d %d",&numNodes,&numEdges);
for(int i = 1; i <= numEdges; i++)
{
int nodeX, nodeY, capXY;
scanf("%d %d %d",&nodeX,&nodeY,&capXY);
G[ nodeX ].push_back( nodeY );
G[ nodeY ].push_back( nodeX );
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();
else
for(int i = 0; i < G[ node ].size(); i++)
{
int nextNode = G[ node ][ i ];
if( cap[ node ][ nextNode ] > 0 && viz[ nextNode ] == false )
{
father[ nextNode ] = node;
viz[ nextNode ] = true;
findAugPaths( nextNode );
viz[ nextNode ] = false;
father[ nextNode ] = 0;
}
}
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
readData();
viz[ 1 ] = true;
findAugPaths(1);
printf("%d",answer);
return 0;
}