Pagini recente » Cod sursa (job #99083) | Cod sursa (job #1738534) | Cod sursa (job #1644507) | Cod sursa (job #1492341) | Cod sursa (job #401288)
Cod sursa(job #401288)
#include <cstdio>
#include <cstring>
#define file_in "maxflow.in"
#define file_out "maxflow.out"
#define Nmax 1101
int n,m;
int C[Nmax][Nmax];
int F[Nmax][Nmax];
int viz[Nmax];
void citire()
{
int i,a,b,c;
freopen(file_in,"r",stdin);
freopen(file_out,"w",stdout);
scanf("%d %d", &n, &m);
for (i=1;i<=m;++i)
{
scanf("%d %d %d", &a, &b, &c);
C[a][b]=c;
}
}
int bfs()
{
int p,u,q[Nmax],i,x;
memset(viz,0,sizeof(viz));
q[1]=1;
viz[1]=-1;
p=u=1;
while(p<=u)
{
x=q[p++];
for (i=1;i<=n;++i)
if (!viz[i] && C[x][i]>F[x][i])
{
viz[i]=x;
q[++u]=i;
if (i==n) return 1;
}
}
return 0;
}
inline int min(int a, int b) { return a<b?a:b; }
int maxflow()
{
int i,j,v=0,flow=0;
for(;bfs();)
{
for (i=1;i<=n;++i)
{
if (C[i][n]<=F[i][n] || viz[i]<=0)
continue;
v=C[i][n]-F[i][n];
for (j=i;j!=1;j=viz[j])
v=min(v,C[viz[j]][j]-F[viz[j]][j]);
if (v==0)
continue;
F[i][n]+=v;
F[n][i]-=v;
for (j=i;j!=1;j=viz[j])
F[j][viz[j]]-=v,
F[viz[j]][j]+=v;
flow+=v;
}
}
return flow;
}
int main()
{
citire();
printf("%d\n", maxflow());
fclose(stdin);
fclose(stdout);
return 0;
}