Cod sursa(job #768246)

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

struct list{
	int v;
	struct list *next;
} *G[1001];
int N, root[1001], cap[1001][1001], maxFlow;

int BF()
{
	int l, r, queue[1001];
	struct list *p;
	
	memset(root, 0, sizeof(root));
	queue[0] = 1;
	root[1] = -1;
	
	for(l = r = 0; l <= r; ++l)
		for(p = G[ queue[l] ]; p; p = p->next)
			if(!root[p->v] && cap[ queue[l] ][p->v])
			{
				queue[++r] = p->v;
				root[p->v] = queue[l];
				if(p->v == N) return 1;
			}
	return 0;
}

int main()
{
	struct list *p;
	FILE *in, *out;
	int a, b, c, min, m, i;
	
	in = fopen("maxflow.in", "r");
	fscanf(in, "%d %d", &N, &m);
	for(; m; --m)
	{
		fscanf(in, "%d %d %d", &a, &b, &c);
		cap[a][b] = c;
		p = malloc(sizeof(struct list));
		p->v = b;
		p->next = G[a];
		G[a] = p;
	}
	fclose(in);
	
	while(BF())
	{
		for(min = 1<<20, i = N; root[i] != -1; i = root[i])
			if(min > cap[ root[i] ][i])
				min = cap[ root[i] ][i];
		
		for(i = N; root[i] != -1; i = root[i])
			cap[ root[i] ][i] -= min;
		
		maxFlow += min;
	}
	
	out = fopen("maxflow.out", "w");
	fprintf(out, "%d\n", maxFlow);
	fclose(out);
	return 0;	
}