Cod sursa(job #255587)

Utilizator zbarniZajzon Barna zbarni Data 10 februarie 2009 01:06:10
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <stdio.h>
#define nmax 1024
#define min(x,y) ((x)<(y)?(x):(y))
int flux[nmax][nmax], cap[nmax][nmax];
int n, m, x, y, z;
int tat[nmax];
  
int bfs(int s, int d)
{   
    int que[nmax];
    tat[que[0] = 1] = -1;
  
    for (int p = 0, u = 0; p <= u; p++)   
        for (int i = 1, nod = que[p]; i <= n; i++)   
	    if (!tat[i] && cap[nod][i] > flux[nod][i])
            {   
                tat[que[++u] = i] = nod;   
                if (i == d)   
                    return 1;   
            }   
  
    return 0;   
}
  
int flux_maxim()   
{   
    int flux_max = 0, r,j;
    for (; bfs(1, n); )
	for (int i = 1; i <= n; i++)
	{
	    if (tat[i] <= 0 || cap[i][n] <= flux[i][n])
		continue;
	    r = cap[i][n] - flux[i][n];

	    for (j = i; j != 1; j = tat[j])
		r = min(r, cap[tat[j]][j] - flux[tat[j]][j]);

	    if (!r)
		continue;
	    flux[i][n] += r;
	    flux[n][i] -= r;

	    for (j = i; j != 1; j = tat[j])
	    {
		flux[tat[j]][j] += r;
		flux[j][tat[j]] -= r;
	    }

	    flux_max += r;
	}
    return flux_max;
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d %d", &n, &m);
    for (int i = 0; i < m; i++)
    {
	scanf("%d %d %d", &x, &y, &z);
	cap[x][y] = z;
    }
    printf("%d\n", flux_maxim());
    fclose(stdin);
    fclose(stdout);
    return 0;
}