Pagini recente » Cod sursa (job #2478888) | Cod sursa (job #2663588) | Cod sursa (job #526349) | Cod sursa (job #219242) | Cod sursa (job #292599)
Cod sursa(job #292599)
#include <stdio.h>
const int MAXN = 1024;
const int MAXK = 2147483647;
struct borcan
{ int a,b; };
int C[MAXN][MAXN];
int F[MAXN][MAXN];
int *V[MAXN];
borcan A[10*MAXN];
int No[MAXN];
int vizit[MAXN];
int chestie[MAXN],ce;
int chestiE[MAXN];
int N,M;
inline int MIN(int a, int b)
{ if (a>b) return b; return a;}
inline void sosete()
{
int i,X,Y,Z;
scanf("%d%d",&N,&M);
for (i=0; i<M; ++i)
{
scanf("%d%d%d",&X,&Y,&Z);
C[X][Y]+=Z;
A[2*i].a=X; A[2*i].b=Y; No[X]++;
A[2*i+1].a=Y; A[2*i+1].b=X; No[Y]++;
}
for (i=1; i<=N; ++i)
{ V[i]=new int [ No[i] +2 ]; V[i][0]=0; }
for (i=0,Z=2*M; i<Z; ++i)
V[ A[i].a ][ ++V[A[i].a][0] ]=A[i].b;
}
inline int ciuperca()
{
int i,j;
chestie[0]=1; ce=1; vizit[1]=1;
for (i=2; i<=N; ++i)vizit[i]=0;
for (i=0; i<ce; ++i)
if (chestie[i]!=N)
for (j=1; j<=V[ chestie[i] ][0]; ++j)
if (F[chestie[i]][ V[ chestie[i] ][j] ]!=C[chestie[i]][ V[ chestie[i] ][j] ] && vizit[ V[ chestie[i] ][j] ]==0)
{
vizit[ V[ chestie[i] ][j] ] = 1;
chestie[ ce++ ] = V[ chestie[i] ][j];
chestiE[ V[ chestie[i] ][j] ] = chestie[i];
}
return vizit[N];
}
inline void bocanci()
{
int munte=0,vale,j,i;
while (ciuperca())
for (j=1; j<= V[N][0]; ++j)
if ( F[ V[N][j] ][N]!=C[ V[N][j] ][N] && vizit[ V[N][j] ])
{
chestiE[N] = V[N][j]; vale=MAXK;
for (i=N; i!=1; i=chestiE[i])
vale=MIN(vale,C[ chestiE[i] ][i] - F[chestiE[i]][i]);
if (vale)
for (i=N; i!=1; i=chestiE[i])
{
F[chestiE[i]][i]+=vale;
F[i][chestiE[i]]-=vale;
}
munte+=vale;
}
printf("%d\n",munte);
}
int main()
{
freopen("maxflow.in" ,"r",stdin );
freopen("maxflow.out","w",stdout);
sosete();
bocanci();
fclose(stdin );
fclose(stdout);
return 0;
}