Pagini recente » Cod sursa (job #1086606) | Cod sursa (job #343967) | Cod sursa (job #2976267) | Cod sursa (job #2241807) | Cod sursa (job #434404)
Cod sursa(job #434404)
#include<fstream>
using namespace std;
# define MAXN 1024
int n, m, qSize, lSize;
int cap [ MAXN ] [ MAXN ], coada [ MAXN ], from [ MAXN ], leafs [ MAXN ];
bool viz [ MAXN ];
int findPath(){
int head = 0, i, dad, pathCap, gPathCap = 0;
bool ok;
memset ( viz, 0, sizeof ( viz ) );
memset ( from, -1, sizeof ( from ) );
qSize = lSize = 0;
coada [ qSize ++ ] = 1;
viz [ 1 ] = 1;
ok = 1;
while ( head < qSize && ok ){
for ( i = 1; i <= n && ok ; i ++ )
if ( cap [ coada [ head ] ] [ i ] > 0 && ! viz [ i ] ){
coada [ qSize ++ ] = i;
viz [ i ] = 1;
from [ i ] = coada [ head ];
if ( i == n ) leafs [ lSize ++ ] = coada [ head ], qSize --, viz [ n ] = 0;
}
head ++;
}
if ( from [ n ] == -1 ) return 0;
for ( i = 0; i < lSize; i ++ ){
dad = n; pathCap = 120000;
from [ n ] = leafs [ i ];
while ( from [ dad ] != -1 ){
if ( cap [ from [ dad ] ] [ dad ] < pathCap )
pathCap = cap [ from [ dad ] ] [ dad ];
dad = from [ dad ];
}
dad = n;
while ( from [ dad ] != -1 ){
cap [ from [ dad ] ] [ dad ] -= pathCap;
cap [ dad ] [ from [ dad ] ] += pathCap;
dad = from [ dad ];
}
gPathCap = gPathCap + pathCap;
}
return gPathCap;
}
int maxFlow(){
int d, flow=0;
while ( 1 ){
d = findPath ();
if( d == 0 ) return flow;
else flow = flow + d;
}
}
int main(){
int x, y, c, i, flow = 0;
ifstream f ( "maxflow.in" );
f >> n >> m;
for ( i = 0; i < m; i ++ ){
f >> x >> y >> c;
cap [ x ] [ y ] = c;
}
f.close();
flow = maxFlow ();
ofstream g ( "maxflow.out" );
g << flow << '\n';
g.close();
return 0;
}