Cod sursa(job #433325)

Utilizator iamdoruTanase Theodor iamdoru Data 3 aprilie 2010 16:10:58
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<stdio.h>
#include<stdlib.h>
FILE *f,*g;
int nr,sem=1,n,m,v[1001][1001],*r[1001],t[1001],max;
int minus() 
	{
	int minim=150000,w;
	w=n;
	while(t[w]!=0) 
		{
		if(v[t[w]][w]<minim)
			minim=v[t[w]][w];
		w=t[w];
		}
	return minim;
	}
void down(int val) 
	{
	int w;	
	w=n;
	while(t[w]!=0) 
		{
		v[t[w]][w]-=val;
		w=t[w];
		}
	}
int bf() 
	{
	int pass,p=1,u=1,k,coada[1001],sel[1001];
	sel[1]=nr;
	t[1]=0;
	coada[1]=1;
	while(p<=u) 
		{
		for(k=1;k<=r[coada[p]][0];k++)
			{
			if(v[coada[p]][r[coada[p]][k]]!=0)
				{
				u++;
				coada[u]=r[coada[p]][k];
				sel[coada[u]]=nr;
				t[coada[u]]=coada[p];
				if(coada[u]==n) 
					{
					pass=minus();
					down(pass);
					max+=pass;
					return 1;
					}
				}
			}
		p++;
		}	
	return 0;
	}


int main() 
	{
	int i,c,x,y;	
	f=fopen("maxflow.in","r");
	fscanf(f,"%d%d",&n,&m);
for(i=1;i<=n;i++) 
	{
	r[i]=(int*)realloc(r[i],sizeof(int));
	r[i][0]=0;
	}
for(i=1;i<=m;i++)
		{
		fscanf(f,"%d%d%d",&x,&y,&c);
		v[x][y]=c;
		r[x][0]++;
		r[x]=(int*)realloc(r[x],(r[x][0]+1)*sizeof(int));
		r[x][r[x][0]]=y;
		}
fclose(f);	
while(sem==1) 	
	{
	nr++;
	sem=bf();
	}
g=fopen("maxflow.out","w");
fprintf(g,"%d\n",max);
fclose(g);	
return 0;		
	}