Pagini recente » Istoria paginii planificare/sedinta-20081107 | Cod sursa (job #307579) | Cod sursa (job #3150223) | Istoria paginii planificare/sedinta-20080303 | Cod sursa (job #291253)
Cod sursa(job #291253)
#include <stdio.h>
#include <string.h>
#define N 5
int n,a[N][N],tata[N],viz[N],f;
struct nod
{int n;
nod *urm;
}*prim,*ultim;
void push(int k)
{nod *p=new nod;
p->n=k;
p->urm=NULL;
if(prim==NULL)
prim=p;
else
ultim->urm=p;
ultim=p;
}
int pop()
{int k;nod* p;
p=prim;k=prim->n;
prim=prim->urm;
delete p;
return k;
}
int bf()
{int q,i;
push(1);
while(prim!=NULL)
{q=pop();
for (i=1;i<=n;i++)
{if(viz[i]==0&&a[q][i]!=0)
{if (i==n)
return q;
viz[i]=1;
tata[i]=q;
push(i);
}
}
}
return 0;
}
void opt(int q)
{int i,min;
for (i=q,min=a[q][n];i>1;i=tata[i])
{if (min>a[tata[i]][i])
min=a[tata[i]][i];
}
a[q][n]-=min;
a[n][q]+=min;
f+=min;
for (i=q;i>1;i=tata[i])
{a[tata[i]][i]-=min;
a[i][tata[i]]+=min;
}
}
int main ()
{int m,i,x,y,z,min,q;
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;
}
while(q=bf())
{opt(q);
do
{while(prim!=NULL)
{q=pop();
if(a[q][n]!=0)break;
}
opt(q);
}while(prim!=NULL);
memset(viz,0,sizeof(viz));
memset(tata,0,sizeof(tata));
}
i=i;
printf("%d",f);
return 0;
}