Pagini recente » Cod sursa (job #1756560) | Cod sursa (job #2077904) | Cod sursa (job #1267654) | Cod sursa (job #1716986) | Cod sursa (job #1644092)
#include <fstream>
#include <cstdio>
#include <cstring>
#define inf 16838
using namespace std;
int f[1002][1002],c[1002][1002],t[1002],flux,vf,n,m,x,y,c1;
ifstream f1("maxflow.in");
ofstream g("maxflow.out");
int bf(int s,int d)
{ int p,u,nod,i,q[1002];
memset(t,0,sizeof(t));
p=0;
u=0;
t[s]=-1;
q[p]=s;
for(;p<=u;p++)
{nod=q[p];
for(i=1;i<=n;i++)
if(!t[i]&&c[nod][i]>f[nod][i])
{q[++u]=i;
t[i]=nod;
if(i==d) return 1;
}
}
return 0;
}
/*void flux_maxim()
{int i,r;
for(flux=0;bf(1,n);flux+=r)
{ r=inf;
i=n;
while(i!=1)
{ r=min(r,c[t[i]][i]-f[t[i]][i]);
i=t[i];
}
i=n;
while(i!=1)
{ f[t[i]][i]+=r;
f[i][t[i]]-=r;
i=t[i];
}
}
}
void afis()
{ int i;
for(i=1;i<=n;i++)
vf+=f[i][n];
g<<vf;
}
*/
void flux_maxim()
{ int i,j,r;
for(flux=0;bf(1,n);)
for(i=1;i<=n;i++)
{ if(t[i]==-1||c[i][n]<=f[i][n])
continue;
r=c[i][n]-f[i][n];
for(j=i;j!=1&&j;j=t[j])
r=min(r,c[t[j]][j]-f[t[j]][j]);
if(r==0) continue;
f[i][n]+=r;
f[n][i]-=r;
for(j=i;j!=1;j=t[j])
{f[t[j]][j]+=r;
f[j][t[j]]-=r;
}
flux+=r;
}
}
int main()
{ f1>>n>>m;
for(int i=1;i<=m;i++)
{ f1>>x>>y>>c1;
c[x][y]=c1;
}
flux_maxim();
//afis();
g<<flux;
return 0;
}