Cod sursa(job #372822)

Utilizator bent_larsenSturzu Antonio-Gabriel bent_larsen Data 11 decembrie 2009 20:28:27
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
#define pb push_back
#define mp make_pair

using namespace std;

vector <int> v[1001];
int cap[1001][1001],prev[1001],n;

int bf()
{
	int coada[1000],viz[1001],tail,head,nod,i,nod1;

	tail=0;
	head=1;
	coada[tail]=1;//bag sursa in coada
	memset(viz,0,1001*sizeof(int));
	viz[1]=1;//marchez sursa ca vizitata
	prev[1]=-1;

	while(tail!=head)
	{
		nod=coada[tail];
		tail++;
		for(i=0;i<(int) v[nod].size();i++)
		{
			nod1=v[nod][i];
			if(viz[nod1]==0 && cap[nod][nod1]>0)
			{
				viz[nod1]=1;
				coada[head++]=nod1;
				prev[nod1]=nod;
			}
		}
	}
	if(viz[n]==1)
		return 1;
	return 0;
}
							
int flux_maxim()
{
	
	int flux=0,cmin=110001,nod=n,nod1;

	while(bf())
	{
		while(prev[nod]!=-1)
		{
			nod1=prev[nod];
			if(cap[nod1][nod]<cmin)
				cmin=cap[nod1][nod];
			nod=nod1;
		}
		nod=n;
		while(prev[nod]!=-1)
		{
			nod1=prev[nod];
			cap[nod1][nod]+=cmin;
			cap[nod][nod1]-=cmin;
			nod=nod1;
		}
		flux+=cmin;
	}
	return flux;
}
									
int main()
{
	int m,x,y,c,i;
	FILE *f=fopen("maxflow.in","r");

	fscanf(f,"%i%i",&n,&m);
	for(i=0;i<m;i++)
	{
		fscanf(f,"%i%i%i",&x,&y,&c);
		v[x].pb(y);
		v[y].pb(x);
		cap[x][y]=c;
		cap[y][x]=0;
	}
	fclose(f);
	f=fopen("maxflow.out","w");
	fprintf(f,"%i\n",flux_maxim());
	fclose(f);
	return 0;
}