Pagini recente » Cod sursa (job #1879035) | Cod sursa (job #728002) | Cod sursa (job #2504281) | Cod sursa (job #3142461) | Cod sursa (job #269163)
Cod sursa(job #269163)
#include<stdio.h>
#include<string.h>
#define N 1050
int c[N][N], flux, d[N], k, cost, n, m;
void citire()
{
freopen("maxflow.in","r",stdin);
int i, x, y;
scanf("%d %d", &n, &m);
for( i = 1; i <= m; i++)
{
scanf("%d %d %d ", &x, &y, &cost);
c[x][y] += cost;
}
}
void schimb(int &zicu,int &pele)
{
int lobont = zicu;
zicu = pele;
pele = lobont;
}
void bf()
{
int viz[N], coada[N], t[N], i, j, p, u, nod_cur;
memset(viz, 0 ,N);
memset(coada, 0, N);
memset(t, 0 , N);
memset(d,0,N);
p = u = 1;
coada[p] = 1;
viz[1] = 1;
k = 0;
while(p <= u)
{
nod_cur = coada[p];
for(i = 1; i <= n; i++)
if(viz[i] != 1 && c[nod_cur][i] > 0)
{
coada[++u] = i;
viz[i] = 1;
t[i] = nod_cur;
if(i == n)
{
d[++k] = n;
int x = n;
while(t[x] != 0)
{
d[++k] = t[x];
x = t[x];
}
for(j = 1; j <= k/2; j++)
schimb(d[j], d[k-j+1]);
return;
}
}
p++;
}
}
void FordFulkerson()
{
int i, min;
do
{
bf();
if(k>0)
{
min = c[d[1]][d[2]];
for(i = 2; i < k; i++)
if(c[d[i]][d[i+1]] < min)
min = c[d[i]][d[i+1]];
flux +=min;
for(i = 1; i < k; i++)
{
c[d[i]][d[i+1]] -=min;
c[d[i+1]][d[i]] +=min;
}
}
}
while(k != 0);
}
int main()
{
freopen("maxflow.out","w",stdout);
citire();
FordFulkerson();
printf("%d", flux);
return 0;
}