Pagini recente » Cod sursa (job #3277155) | Cod sursa (job #2562428) | Cod sursa (job #2914600) | Cod sursa (job #819386) | Cod sursa (job #2071623)
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <vector>
#include <queue>
#include <string.h>
using namespace std;
const int NMAX = 1002 ;
const int INF = 1e9 ;
int noNodes, noEdges ;
int remainingFlow [ NMAX ][ NMAX ] , parent [ NMAX ];
int totalFlow ;
vector < int > muc [ NMAX ];
queue < int > que ;
int bfs ( int source, int dest ){
while ( !que.empty() ){
que.pop();
}
memset ( parent , 0 , sizeof parent );
que.push( source );
parent [ source ] = -1 ;
while ( !que.empty() ){
int crNode = que.front();
que.pop();
if ( crNode == dest ){
return 1 ;
}
for ( auto it = muc[ crNode ].begin() ; it != muc[ crNode ].end() ; it++ ){
if ( remainingFlow [ crNode ][ *it ] > 0 && !parent[ *it ] ){
parent [ *it ] = crNode ;
que.push ( *it );
}
}
}
return 0 ;
}
int main(){
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&noNodes , &noEdges);
for ( int i = 0 ; i < noEdges ; i++ ){
int x , y , capacity ;
scanf("%d%d%d",&x,&y,&capacity);
remainingFlow [ x ][ y ] = capacity ;
if ( remainingFlow [ y ][ x ] == 0 ){
muc [ x ].push_back ( y );
muc [ y ].push_back ( x );
}
}
while( bfs ( 1 , noNodes ) ){
for ( int vec : muc [ noNodes ] ){
if ( !parent [ vec ] ){
continue;
}
int crFlow = remainingFlow [ vec ][ noNodes ] ;
for ( int crNode = vec ; parent [ crNode ] != -1 ; crNode = parent [ crNode ] ){
crFlow = min ( crFlow , remainingFlow [ parent [ crNode] ][ crNode ] ) ;
}
totalFlow += crFlow ;
remainingFlow [ vec ] [ noNodes ] -= crFlow ;
remainingFlow [ noNodes ] [ vec ] += crFlow ;
for ( int crNode = vec ; parent [ crNode ]!= -1 ; crNode = parent [ crNode ] ){
remainingFlow [ parent [ crNode ] ] [ crNode ] -= crFlow ;
remainingFlow [ crNode ] [ parent [ crNode ] ] += crFlow ;
}
}
}
printf("%d",totalFlow );
return 0;
}