Pagini recente » Cod sursa (job #1164347) | Cod sursa (job #71852) | Cod sursa (job #870732) | Cod sursa (job #1806920) | Cod sursa (job #1083583)
// http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=maxFlow
# include <cstdio>
# include <cstring>
# define Nmax 1024
using namespace std;
int n, m, f;
int sursa, dest;
int T[Nmax], c[Nmax], Ct[Nmax][Nmax], F[Nmax][Nmax];
bool viz[Nmax];
int bf()
{
int p, u, x, i;
//cautam drumul de ameliorare
memset(viz, 0, sizeof(viz));
p = u = 1; c[1] = sursa;
while(p <= u)
{
x = c[p];
for(i=1; i<=n; ++i)
if(Ct[x][i] - F[x][i] > 0 && viz[i]==0)
{
c[++u] = i;
viz[i] = 1;
T[i] = x; //construim arborele BFS
}
p++;
}
return viz[dest];
}
int main()
{
int x, y, c, min, i, j;
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)
{
// cautam valoarea minima cu care poate fi marit fluxul
// asociat fiecarei muchii care se afla pe drumul gasit
min = Ct[i][n] - F[i][n];
for(j=i; j!=1; j=T[j])
if(Ct[T[j]][j] - F[T[j]][j] < min)
min = Ct[T[j]][j] - F[T[j]][j];
// luam fiecare muchie x -> y si marim fluxul pe aceasta muchie
// cu valoarea min, scazand de asemena tot aceasi valoare pe muchia y -> x.
for(j=i; j!=1; j=T[j])
{
F[T[j]][j] += min;
F[j][T[j]] -= min;
}
F[i][n] += min;
F[n][i] -= min;
f += min;
}
}
printf("%d\n", f);
return 0;
}