Pagini recente » Cod sursa (job #1991497) | Cod sursa (job #29971) | Cod sursa (job #18096) | Cod sursa (job #128844) | Cod sursa (job #290414)
Cod sursa(job #290414)
#include <stdio.h>
#include <string.h>
#define N 1001
#define INF 120000
int n,m,a[N][N];
int tata[N];
int viz[N];
struct nod
{int n;
nod* urm;
}*prim,*ultim;
void push(int n)
{nod *p=new nod;
p->n=n;
if(prim==0)
prim=p;
else
ultim->urm=p;
p->urm=NULL;
ultim=p;
}
int pop()
{nod *p=prim;
int a=p->n;
prim=prim->urm;
delete p;
return a;
}
int bf()
{int flag=0,q,i;//presupunem ca nu da de sursa
push(1);
while(prim!=0)
{q=pop();
for (i=1;i<=n;i++)
{if(viz[i]==0&&a[q][i]>0)
{tata[i]=q;
if(i==n){return 1;}
push(i);
viz[i]=1;
}
}
}
return 0;
}
int main ()
{int i,j,f,x,y,z,min,max;
prim=NULL;ultim=NULL;
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m);
for (i=1;i<=m;i++)
{scanf("%d%d%d",&x,&y,&z);
a[x][y]=z;//muchie de la x la y cu capacitatea z
}
f=0;
while(bf())
{for (i=n,max=INF;i>1;i=tata[i])
{if(a[tata[i]][i]<max)
{max=a[tata[i]][i];
}
}
for (i=n;i>1;i=tata[i])
{a[tata[i]][i]-=max;
a[i][tata[i]]+=max;
}
f+=max;
memset(tata,0,sizeof(tata));
memset(viz,0,sizeof(viz));
while(prim!=0)pop();
}
printf("%d",f);
return 0;
}