Cod sursa(job #626725)

Utilizator sebii_cSebastian Claici sebii_c Data 28 octombrie 2011 01:28:09
Problema Flux maxim Scor 70
Compilator c Status done
Runda Arhiva educationala Marime 1.8 kb
#include <stdio.h>
#include <stdlib.h>
#define NMAX 1010
#define INF (1<<30)

int Q[NMAX], from[NMAX], viz[NMAX];
int *A[NMAX];
int C[NMAX][NMAX];
int head, tail, s, d;
int N, M;

int bfs();

inline int min(int a, int b)
{
    return (a<b)?a:b;
}

void read()
{
    int i, x, y, cost;
    scanf("%d %d", &N, &M);
    for (i=1; i<=N; ++i) {
	A[i] = (int*)realloc(A[i], sizeof(int));
	A[i][0] = 0;
    }
    for (i=1; i<=M; ++i) {
	scanf("%d %d %d", &x, &y, &cost);
	++A[x][0];
	A[x] = (int*)realloc(A[x], (A[x][0]+1)*sizeof(int));
	A[x][A[x][0]] = y;
	++A[y][0];
	A[y] = (int*)realloc(A[y], (A[y][0]+1)*sizeof(int));
	A[y][A[y][0]] = x;
	C[x][y] = cost;
    }
}

int max_flow()
{
    int result = 0;
    while (1) {
	int path_cap = bfs();
	if (path_cap == 0)
	    break;
	result += path_cap;
    }
    return result;
}

int bfs()
{
    int flag = 1;
    int v, path_cap, i;
    for (i=1; i<=N; ++i) {
	viz[i] = 0;
	from[i] = -1;
    }
    head = tail = 0;
    Q[++head] = s;
    viz[s] = 1;
    while (tail < head && flag) {
	int node = Q[++tail];
	for (i=1; i<=A[node][0]; ++i)
	    if (!viz[A[node][i]] && C[node][A[node][i]] > 0) {
		viz[A[node][i]] = 1;
		from[A[node][i]] = node;
		Q[++head] = A[node][i];
		if (A[node][i] == d) {
		    flag = 0;
		    break;
		}
	    }
    }
    v = d, path_cap = INF;
    while (from[v] > -1) {
	path_cap = min(path_cap, C[from[v]][v]);
	v = from[v];
    }
    v = d;
    while (from[v] > -1) {
	C[from[v]][v] -= path_cap;
	C[v][from[v]] += path_cap;
	v = from[v];
    }
    if (path_cap == INF) 
	return 0;
    return path_cap;
}

int main()
{
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);
    read();
    s = 1, d = N;
    printf("%d ", max_flow());
    return 0;
}