Cod sursa(job #386871)

Utilizator cristiprgPrigoana Cristian cristiprg Data 26 ianuarie 2010 11:26:33
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <cstdio>

#define DIM 1005

int n, m, c[DIM][DIM], T[DIM], fluxmaxim, QQ;
struct nod
{
	int x;
	nod *next;
};

void afisare()
{
	for (int i = 1; i <= n; ++i)
	{
		printf("%d:", i);
		for (int j = 1; j <= n; ++j)
			printf ("%3d ", c[i][j]);
		printf("\n");
		
	}
}

int BFS()
{
	nod *st = new nod, *dr, *t;
	st -> x = 1;
	st -> next = NULL;
	dr = st;
	int i, k;
	for (i = 1; i <= n; ++i)
		T[i] = -1;
	T[1]=0;
	while (st)
	{
		k = st -> x;
//		printf("%d ",k );
		for (i = 1; i <= n; ++i)
			if (c[k][i] && T[i] == -1)
			{
					t = new nod;
					t -> x = i;
					t -> next = NULL;
					dr -> next = t;
					dr = t;
					
					T[i] = k;
					if(i==n){
	//				   printf(" - %d\n",++QQ);
					   return 1;
				   }
			}
		t = st -> next;
		delete st;
		st = t;
	}
	
	return 0;
	
}

void EK(){
	while(BFS()){
		int i=n, cmin=1<<30;
		int * t=T;
		for(i=n ; t[i]; i=t[i])
			if(c[t[i]][i]<cmin)
				cmin=c[t[i]][i];
		fluxmaxim+= cmin;
		for(i=n ; t[i]; i=t[i]){
			c[t[i]][i] -= cmin;
			c[i][t[i]] += cmin;
		}
	}
}

int main()
{
	FILE *f = fopen("maxflow.in", "r");
	
	fscanf(f, "%d%d", &n, &m);
	for (int i = 1, x, y, cc; i <= m; ++i)
		fscanf(f, "%d%d%d", &x, &y, &cc), c[x][y]=cc;
	fclose(f);
//	afisare();
	EK();
	f = fopen("maxflow.out", "w");
	
	fprintf(f, "%d\n", fluxmaxim);
	fclose(f);
	return 0;
}