Pagini recente » Cod sursa (job #1431910) | Cod sursa (job #787017) | Cod sursa (job #3273510) | Cod sursa (job #840458) | Cod sursa (job #240923)
Cod sursa(job #240923)
#include <cstdio>
#define min(x,y) ((x)<(y)?(x):(y))
#define abs(x) ((x)>0?x:-x)
#define MAXV 1001
using namespace std;
int n,m,s,d,v[MAXV],q[MAXV];
int c[MAXV][MAXV];//capacitate
int f[MAXV][MAXV];//flux
void citire()
{
freopen("maxflow.in","r",stdin);
scanf("%d%d", &n, &m);//, &s, &d);
s=1,d=n;
int x,y,cst;
for (int i=0; i<m; i++)
{
scanf("%d%d%d", &x, &y, &cst);
c[x][y]=cst;
}
}
int bfs()
{
//returneaza 1 daca iesirea retelei nu a fost marcata
int p,u,x;
q[0]=s;
p=u=0;
v[s]=1;
while (p<=u && !v[d])
{
x=q[p++];
for (int i=1; i<=n; i++)
if (!v[i])
if (f[x][i]<c[x][i])
{
v[i]=x;
q[++u]=i;
}
else if (f[i][x]>0)
{
v[i]=-x;
q[++u]=i;
}
}
return !v[d];
}
void ek()
{
int l[MAXV],a,b,lg,V;
do
{
//marcam varfurile printr-o parcurgere in latime
for (int i=1; i<=n; i++)
v[i]=0;
if (bfs())
return;
//determinam lantzul de ameliorare in vectorul l
l[0]=d;
lg=0;
a=b=10000;
while (l[lg]!=s)
{
l[++lg]=abs(v[l[lg-1]]);
if (v[l[lg-1]]>0)
a=min(a,c[l[lg]][l[lg-1]]-f[l[lg]][l[lg-1]]);
else
if (v[l[lg-1]]<0)
b=min(b,f[l[lg-1]][l[lg]]);
}
V=min(a,b);
//maxim fluxul de-a lungul lantului
for (int i=lg; i>0; i--)
if (v[l[i-1]]>0)
f[l[i]][l[i-1]]+=V;
else
f[l[i-1]][l[i]]-=V;
}
while (1);
}
void afisare()
{
int vf=0;
// for (int i=1; i<=n; i++)
// for (int j=1; j<=n; j++)
// if (f[i][j])
// printf("Fluxul arcului (%d %d)=%d\n",i,j,f[i][j]);
for (int i=1; i<=n; i++)
vf+=f[i][d];
// printf("Fluxul maxim este %d\n", vf);
printf("%d\n",vf);
}
int main()
{
freopen("maxflow.out","w",stdout);
citire();
ek();
afisare();
return 0;
}