Pagini recente » Cod sursa (job #879883) | Cod sursa (job #1811929) | Cod sursa (job #1894925) | Cod sursa (job #1958093) | Cod sursa (job #329569)
Cod sursa(job #329569)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define in "maxflow.in"
#define out "maxflow.out"
#define NMAX 1005
#define INF (1<<30)
#define ALB 0
#define GRI 1
#define NEGRU 2
#define minim(a,b) ((a) < (b) ? (a) : (b) )
typedef struct nod {
int vf;
struct nod *next;
} *PNOD, NOD;
PNOD L[NMAX];
int N, M, flow;
int Q[NMAX], tata[NMAX];
int C[NMAX][NMAX], F[NMAX][NMAX];
int color[NMAX];
void Add ( int i, int j )
{
PNOD p = (PNOD)calloc ( 1, sizeof(NOD) );
p->vf = j;
p->next = L[ i ];
L[ i ] = p;
}
int BF()
{
memset ( Q, 0, sizeof(Q) );
memset ( color, 0, sizeof(color) );
Q[ 0 ] = Q[ 1 ] = 1;
color[ 1 ] = GRI;
int i, nod;
PNOD p;
for ( i = 1; i <= Q[ 0 ]; ++i )
{
nod = Q[ i ];
for ( p = L[ nod ]; p; p = p->next )
{
if ( C[nod][p->vf] == F[nod][p->vf] || color[p->vf] != ALB ) continue;
color[p->vf] = GRI;
Q[ ++Q[ 0 ] ] = p->vf;
tata[ p->vf ] = nod;
if ( p->vf == N ) return 1;
}
color[ nod ] = NEGRU;
}
return 0;
}
int main ( void )
{
freopen ( in, "r", stdin );
freopen ( out, "w", stdout );
scanf ( "%d%d", &N, &M );
int i, j, c, fmin, nod;
PNOD p;
for ( ; M; --M )
{
scanf ( "%d%d%d", &i, &j, &c );
Add ( i, j );
Add ( j, i );
C[i][j] += c;
}
for ( flow = 0; BF(); )
{
for ( p = L[N]; p; p = p->next )
{
nod = p->vf;
if ( F[ nod ][ N ] == C[ nod ][ N ] || color[ nod ] == ALB ) continue;
//daca n-am capacitate reziduala si nu am ajuns cu un drum de ameliorare la 'nod'
tata [ N ] = nod;
fmin = INF;
for ( nod = N; nod != 1; nod = tata[ nod ] )
fmin = minim ( fmin, C[ tata[nod] ][nod] - F[ tata[nod] ][nod] );
for ( nod = N; nod != 1; nod = tata[ nod ] )
{
F[ tata[nod] ][nod] += fmin;
F[ nod ][ tata[nod] ] -= fmin;
}
flow += fmin;
}
}
printf ("%d\n", flow );
return 0;
}