Pagini recente » Cod sursa (job #1050196) | Cod sursa (job #2737800) | Cod sursa (job #701679) | Cod sursa (job #2864502) | Cod sursa (job #419322)
Cod sursa(job #419322)
#include<stdio.h>
#include<string.h>
#define Nmax 1010
struct nod
{
int inf;
nod *urm;
}*a[Nmax];
int c[Nmax][Nmax],f[Nmax][Nmax],n,m,ft,t[Nmax],viz[Nmax];
void citire()
{
int x,y,co;
nod *p;
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d %d %d",&x,&y,&co);
p=new nod;
p->inf=y;
p->urm=a[x];
a[x]=p;
c[x][y]=co;
p=new nod;
p->inf=x;
p->urm=a[y];
a[y]=p;
}
}
int coada()
{
int q[Nmax],pr=1,u=1;
memset(viz,0,sizeof(viz));
q[1]=1;
viz[1]=1;
nod *p;
while(pr<=u )
{
if(q[pr]!=n)
for(p=a[q[pr]];p!=NULL;p=p->urm)
{
if(viz[p->inf]==0 && c[q[pr]][p->inf]-f[q[pr]][p->inf]>0)
{
viz[p->inf]=1;
u++;
q[u]=p->inf;
t[p->inf]=q[pr];
}
}
pr++;
}
return viz[n];
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
citire();
nod *p;
int min;
while(coada())
{
for(p=a[n];p!=NULL;p=p->urm)
{
if(c[p->inf][n]-f[p->inf][n]>0 && viz[p->inf]==1)
{
int aj;
aj=p->inf;
min=c[p->inf][n]-f[p->inf][n];
while(aj!=1)
{
if(min>c[t[aj]][aj]-f[t[aj]][aj])
min=c[t[aj]][aj]-f[t[aj]][aj];
aj=t[aj];
}
if(min==0) continue;
f[p->inf][n]+=min;
f[n][p->inf]-=min;
aj=p->inf;
while(aj!=1)
{
f[t[aj]][aj]+=min;
f[aj][t[aj]]-=min;
aj=t[aj];
}
ft+=min;
}
}
}
printf("%d\n",ft);
return 0;
}