Pagini recente » Cod sursa (job #1041199) | Cod sursa (job #311301) | Cod sursa (job #2837925) | Cod sursa (job #1599766) | Cod sursa (job #555445)
Cod sursa(job #555445)
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int nmax = 1024;
int n,m,i,j,x,y,c,minim,sursa,dest,f,Ct[nmax][nmax],F[nmax][nmax],viz[nmax],T[nmax];
queue <int> Q;
bool bf()
{
int x,i;
fill(viz+1,viz+n+1,0);
Q.push(sursa);
while (!Q.empty())
{
x=Q.front();
for (i=1; i<=n; i++)
if (Ct[x][i]-F[x][i]>0 && !viz[i])
{
viz[i]=1;
Q.push(i);
T[i]=x;
}
Q.pop();
}
return viz[dest];
}
int main()
{
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,&c);
Ct[x][y]=c;
}
sursa=1;
dest=n;
while (bf())
{
for (i=1; i<=n; i++)
if (Ct[i][n]-F[i][n]>0)
{
minim=Ct[i][n]-F[i][n];
for (j=i; j!=1; j=T[j])
if (Ct[T[j]][j]-F[T[j]][j]<minim)
minim=Ct[T[j]][j]-F[T[j]][j];
for (j=i; j!=1; j=T[j])
{
F[T[j]][j]+=minim;
F[j][T[j]]-=minim;
}
F[i][n]+=minim;
F[n][i]-=minim;
f+=minim;
}
}
printf("%d\n", f);
return 0;
}