Pagini recente » Cod sursa (job #264303) | Cod sursa (job #305611) | Cod sursa (job #1860522) | Cod sursa (job #3141103) | Cod sursa (job #303153)
Cod sursa(job #303153)
#include <stdio.h>
#include <string.h>
#define NM 1001
#define min(x,y) ((x)>(y)?(y):(x))
int n,m;
int a[NM][NM];
int fr[NM];
int nrfr;
int t[NM];
int viz[NM];
int flux;
int minim;
struct list{int nod;list* urm;}*g[NM];
inline void add(int x,int y)
{list *p=new list;
p->nod=y;
p->urm=g[x];
g[x]=p;
}
void df(int);
int main()
{freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d",&n,&m);
int x,y,c,i;
while (m--)
{scanf("%d %d %d",&x,&y,&c);
add(x,y);
add(y,x);
a[x][y]=c;
}
nrfr=1;
while (nrfr)
{nrfr=0;
memset(viz,0,sizeof(viz));
df(1);
for (i=1;i<=nrfr;i++)
{x=fr[i];
minim=a[x][n];
while (x!=1)
{minim=min(minim,a[t[x]][x]);
x=t[x];
}
flux+=minim;
x=fr[i];
a[x][n]-=minim;
while (x!=1)
{a[t[x]][x]-=minim;
x=t[x];
}
}
}
printf("%d",flux);
return 0;
}
void df(int k)
{viz[k]=1;
list *p;
for (p=g[k];p;p=p->urm)
{if (!viz[p->nod]&&a[k][p->nod])
{if (p->nod==n)
{nrfr++;
fr[nrfr]=k;
}
else
{t[p->nod]=k;
df(p->nod);
}
}
}
}