Cod sursa(job #548166)

Utilizator nickyyLal Daniel Emanuel nickyy Data 7 martie 2011 09:45:30
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <stdio.h>
#include <string.h>
using namespace std;
#define maxn 1005
int c[maxn][maxn],f[maxn][maxn];
int tata[maxn],q[maxn];
int n,flux,cf,sursa,destinatie;

	void citire(void)
	{	FILE *fin=fopen("maxflow.in","r");
		int m,i,j;
		fscanf(fin,"%d%d",&n,&m);
		for(;m;m--)	
			fscanf(fin,"%d%d",&i,&j),
			fscanf(fin,"%d",&c[i][j]);
		fclose(fin);
	}
	
	int bfs(void)
	{	int prim,ultim,u,v;
		memset(tata+1,0,sizeof(int)*n);
		tata[1]=-1; prim=ultim=0; q[0]=1;
		while(prim<=ultim)
		{	u=q[prim++];
			for(v=1;v<=n;v++)
				if(c[u][v]-f[u][v]>0 && !tata[v])
				{	q[++ultim]=v; tata[v]=u;	}
		}
		if(!tata[destinatie]) return 0;
		return 1;
	}
	
	void EdmondKarp(void)
	{	int k,i;
		sursa=1; destinatie=n; flux=0;
		while(bfs())
			for(i=1;i<=n;i++)
				if(c[i][n]-f[i][n]>0)
				{	cf=c[i][n]-f[i][n];
					k=i;
					while(k!=sursa)
					{	if(cf>c[tata[k]][k]-f[tata[k]][k]) cf=c[tata[k]][k]-f[tata[k]][k];
						k=tata[k];
					}
					k=i;
					while(k!=sursa)
					{	f[tata[k]][k]+=cf; f[k][tata[k]]-=cf;
						k=tata[k];
					}
					f[i][n]+=cf; f[n][i]-=cf;
					flux+=cf;
				}
	}
	
	void scrie(void)
	{	FILE *fout=fopen("maxflow.out","w");
		fprintf(fout,"%d",flux);
		fclose(fout);
	}
	
int main(void)
{	citire();
	EdmondKarp();
	scrie();
	return 0;
}