Pagini recente » Cod sursa (job #813680) | Cod sursa (job #3030748) | Cod sursa (job #660715) | Cod sursa (job #183855) | Cod sursa (job #362984)
Cod sursa(job #362984)
#include <cstdio>
#include <string>
#include <math.h>
#define MaxN 1010
#define MAX 0x3f3f3f3f
struct muchie{
int x;
muchie *urm;
};
muchie *G[MaxN],*W[MaxN];
int a[MaxN][MaxN],b[MaxN][MaxN],s[MaxN],N,st,f,sw=1,min,nr,uz[MaxN];
void add(int x,int y)
{
muchie *aux=new muchie;
aux->x=y; aux->urm=G[x];
G[x]=aux;
}
void cit()
{
int i,x,y,c,M;
freopen("maxflow.in","r",stdin);
scanf("%d%d",&N,&M);
st=1; f=N;
for(i=1;i<=M;i++)
{
scanf("%d%d%d",&x,&y,&c);
a[x][y]+=c;
add(x,y);
add(y,x);
}
}
void gasesc_drum()
{
int p,nodc,c[MaxN],i,j;
muchie *q=new muchie;
sw=0;
memset(uz,0,sizeof(uz));
p=1; c[1]=st;
uz[st]=1;
for(j=1;j<=p && !sw;j++)
{
nodc=c[j];
q=G[nodc];
while(q)
{
i=q->x;
if(a[nodc][i]==b[nodc][i] || uz[i])
{
q=q->urm;
continue;
}
uz[i]=1;
c[++p]=i;
s[i]=nodc;
if(i==f)
sw=1;
q=q->urm;
}
}
}
void imbun(int nod)
{
if(nod!=st)
{
if(min>a[s[nod]][nod]-b[s[nod]][nod])
min=a[s[nod]][nod]-b[s[nod]][nod];
imbun(s[nod]);
b[s[nod]][nod]+=min;
b[nod][s[nod]]-=min;
}
}
void det_flux()
{
do{
//memset(s,0,sizeof(s));
gasesc_drum();
min=MAX;
imbun(f);
nr+=min;
}while(sw);
}
void afis()
{
freopen("maxflow.out","w",stdout);
printf("%d\n",nr);
}
int main()
{
cit();
det_flux();
afis();
return 0;
}