Pagini recente » Cod sursa (job #1387887) | Cod sursa (job #643307) | Cod sursa (job #851303) | Cod sursa (job #1070349) | Cod sursa (job #582025)
Cod sursa(job #582025)
#include<stdio.h>
int n,m,i,c[1001][1001],f[1001][1001],x,y,co,flow,fmin,tt[1001],viz[1001],q[1001];
struct nod{int y; nod* next;};
nod *G[1001];
int add(int x,int y)
{
nod *nou=new nod;
nou->y=y;
nou->next=G[x];
G[x]=nou;
return 0;
}
int BF()
{
int i=1,vf;
for (i=1;i<=n;i++) viz[i]=0;
q[0]=q[1]=1;
i=1;
while (i<=q[0])
{
vf=q[i];
nod *it=new nod;
if (vf==n) {i++;continue;}
it=G[vf];
while (it)
{
if (c[vf][it->y]==f[vf][it->y] || viz[it->y]) {it=it->next; continue;}
q[++q[0]]=it->y;
viz[it->y]=1;
tt[it->y]=vf;
it=it->next;
}
i++;
}
return viz[n];
}
int main(void)
{
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,&co);
c[x][y]+=co;
add(x,y);
add(y,x);
}
for (flow=0;BF();)
{
nod *it=new nod;
it=G[n];
while (it)
{
if (!viz[it->y]) {it=it->next;continue;}
tt[n]=it->y;
fmin=1000000000;
for (i=n;i!=1;i=tt[i])
{
if (fmin>c[tt[i]][i]-f[tt[i]][i])
fmin=c[tt[i]][i]-f[tt[i]][i];
}
if (fmin==0) {it=it->next;continue;}
for (i=n;i!=1;i=tt[i])
{
f[tt[i]][i]+=fmin;
f[i][tt[i]]-=fmin;
}
flow+=fmin;
it=it->next;
}
}
printf("%d\n",flow);
return 0;
}