Pagini recente » Cod sursa (job #701963) | Cod sursa (job #666904) | Cod sursa (job #1674499) | Cod sursa (job #1946047) | Cod sursa (job #240854)
Cod sursa(job #240854)
#include <stdio.h>
#include <iostream.h>
using namespace std;
#define MAX 1024
#define INF 0x3f3f3f3f
#define IN "maxflow.in"
#define OUT "maxflow.out"
FILE *fin=fopen(IN,"r");
FILE *fout=fopen(OUT,"w");
int g[MAX][MAX];
int c[MAX][MAX];
int f[MAX][MAX];
int tt[MAX];
int cd[MAX];
int viz[MAX];
int n,m;
int flux;
inline long minim(long,long);
void citire();
void afis();
void alg();
int bf();
int main()
{
citire();
fclose(fin);
alg();
afis();
fclose(fout);
return 0;
}
void citire()
{
int i,x,y,z;
fscanf(fin,"%d %d ",&n,&m);
for(i=1;i<=m;i++)
{
fscanf(fin,"%d %d %d ",&x,&y,&z);
c[x][y]=c[x][y]+z;
g[x][0]++;
g[x][g[x][0]]=y;
g[y][0]++;
g[y][g[y][0]]=x;
}
}
void afis()
{
fprintf(fout,"%d\n",flux);
}
void alg()
{
int nod,fmin,min,i;
for(flux=0;bf();)
for(i=1;i<=g[n][0];i++)
{
nod=g[n][i];
if(f[nod][n]==c[nod][n] || !viz[nod])
continue;
tt[n]=nod;
fmin=INF;
for(nod=n;nod!=1;nod=tt[nod])
fmin=minim(fmin,c[tt[nod]][nod]-f[tt[nod]][nod]);
if(fmin==0)
continue;
for(nod=n;nod!=1;nod=tt[nod])
{
f[tt[nod]][nod]=f[tt[nod]][nod]+fmin;
f[nod][tt[nod]]=f[nod][tt[nod]]-fmin;
}
flux=flux+fmin;
}
}
int bf()
{
int i,j,nod,v;
cd[0]=1;
cd[1]=1;
memset(viz,0,sizeof(viz));
viz[1]=1;
for(i=1;i<=cd[0];i++)
{
nod=cd[i];
if(nod==n)
continue;
for(j=1;j<=g[nod][0];j++)
{
v=g[nod][j];
if(c[nod][v]==f[nod][v] || viz[v])
continue;
viz[v]=1;
cd[++cd[0]]=v;
tt[v] = nod;
}
}
return viz[n];
}
inline long minim(long x,long y)
{
if(x<y)
return x;
return y;
}