Cod sursa(job #768224)

Utilizator igsifvevc avb igsi Data 16 iulie 2012 13:29:01
Problema Flux maxim Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.3 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct list{
	short node;
	int capacity;
	struct list *next;
};
typedef struct list list;

FILE *in, *out;
list *graph[1001];
int maxFlow, f[1001][1001], capacity[1001][1001];
short N, queue[1001], root[1001];

int BF(short source, short destination)
{
	int l, r;
	list *p;
	memset(root, 0, sizeof(root));
	
	queue[0] = source;
	root[source] = -1;
	
	for(l = r = 0; l <= r; ++l)
		for(p = graph[queue[l]]; p; p = p->next)
			if(!root[p->node] && capacity[queue[l]][p->node] > f[queue[l]][p->node])
			{
				queue[++r] = p->node;
				root[p->node] = queue[l];
				if(p->node == destination) return 1;
			}
	return 0;	
}

int main()
{
	list *p;
	short a, b, m, i;
	int c, min;
	
	in = fopen("maxflow.in", "r");
	out = fopen("maxflow.out", "w");
	
	fscanf(in, "%hd %hd", &N, &m);
	for(; m; --m)
	{
		fscanf(in, "%hd %hd %d", &a, &b, &c);
		
		p = malloc(sizeof(list));
		p->node = b;
		capacity[a][b] = c;
		p->next = graph[a];
		graph[a] = p;
	}

	while(BF(1, N))
	{
		for(min = 1 << 20, i = N; i != -1; i = root[i])
			if(min > capacity[root[i]][i] - f[root[i]][i])
				min = capacity[root[i]][i] - f[root[i]][i];
		
		for(i = N; i != -1; i = root[i])
			f[root[i]][i] += min;
			
		maxFlow += min;
	}
	
	fprintf(out, "%d\n", maxFlow);
	
	fclose(in);
	fclose(out);
	return 0;
}