Pagini recente » Cod sursa (job #2701720) | Cod sursa (job #1204892) | Cod sursa (job #2359454) | Cod sursa (job #614481) | Cod sursa (job #879553)
Cod sursa(job #879553)
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
#define pb push_back
#define FORIT( it, v ) for( typeof( (v).begin() )it=(v).begin(); it!=(v).end(); ++it )
#define max_n 1005
#define INF 0x3f3f3f3f
int From[ max_n ], Bf[ max_n ];
int Edge[ max_n ][ max_n ];
vector< int > T[ max_n ];
int i,n,m,a,b,c,max_flow;
void reconstituire(){
int minim = INF<<1;
int varf = n;
while ( varf!=1 ){
minim = min ( minim, Edge[ From[ varf ] ][ varf ] );
varf = From[ varf ];
}
varf = n;
while ( varf!=1 ){
Edge[ From[ varf ] ][ varf ] -= minim;
Edge[ varf ][ From[ varf ] ] += minim;
varf = From[ varf ];
}
max_flow+=minim;
return ;
}
bool get_flow ( ){
int st,dr;
st = dr = 1;
Bf[ 1 ] = 1;
From[ 1 ] = 1;
while ( st <= dr ){
if ( From[ n ] ){
reconstituire();
return 1;
}
int ind = 0;
if ( dr - st )
ind = rand()%( dr-st );
int nod = Bf[ ind+st ];
Bf[ ind+st ]=Bf[ dr-- ];
FORIT( it, T[ nod ] ){
if ( !From[ *it ] && Edge[ nod ][ *it ] ){
From[ *it ] = nod;
Bf[ ++dr ] = *it;
}
}
}
return 0;
}
void solve (){
while ( get_flow() ){
int i;
for ( i=1; i<=n; ++i ){
From[ i ] = 0;
}
}
}
int main(){
srand ( time ( NULL ) );
freopen ("maxflow.in","r",stdin);
freopen ("maxflow.out","w",stdout);
scanf ("%d %d", &n, &m );
for ( i=1; i<=m; ++i ){
//printf("penis!");
scanf ("%d %d %d", &a, &b, &c );
T[ a ].pb ( b );
T[ b ].pb ( a );
Edge[ a ][ b ] = c;
}
solve ( );
printf("%d\n", max_flow );
return 0;
}