Cod sursa(job #581163)

Utilizator niovanIovan Alexandru niovan Data 13 aprilie 2011 20:33:44
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <cstdio>
#define NMax 1001
#define oo 2000000000
#define min(a,b) (a<b?a:b)

using namespace std;

FILE *fin=fopen("maxflow.in","r"),*fout=fopen("maxflow.out","w");

int cap[NMax][NMax],flux[NMax][NMax],t[NMax],n;

void Citire()
{
	int m,x,y,c;
	fscanf(fin,"%d %d",&n,&m);
	while(m--)
	{
		fscanf(fin,"%d%d%d",&x,&y,&c);
		cap[x][y]=c;
	}
}

int bfs(int source,int sink)
{
	int Q[NMax],p=0,u=0,x,i;
	for(i=1;i<=sink;i++) t[i]=0;
	Q[0]=source;
	while(p<=u)
	{
		x=Q[p++];
		for(i=source;i<=sink;i++)//pt toti succesori lui x
			if(!t[i]&&i!=source)
			if(cap[x][i]-flux[x][i]>0)
			{
				Q[++u]=i;
				t[i]=x;
			}
	}
	if(t[sink]) return 1;
	return 0;
}

int dinic(int source,int sink)
{
	int i,j,flow=0,MIN;
	while(bfs(source,sink))
	{
		for(j=source;j<sink;j++)
		if(cap[j][sink]-flux[j][sink]>0)
		{
			MIN=oo;
			MIN=min(MIN,cap[j][sink]-flux[j][sink]);
			for(i=j;i!=source;i=t[i])//gasesc minimul
				MIN=min(MIN,cap[ t[i] ][i]-flux[ t[i] ][i]);
			if(MIN==oo)//nu avem flux pe portiunea aceasta
				continue;
			
			flux[j][sink]+=MIN;
			flux[sink][j]-=MIN;
			for(i=j;i!=source;i=t[i])
				flux[ t[i] ][i]+=MIN,//adun flux pe muchiile directe
				flux[i][ t[i] ]-=MIN;//scad flux pe muchiile inverse
			flow+=MIN;//adaugam minimul la flux
		}
	}
	return flow;
}

int main()
{
	Citire();
	fprintf(fout,"%d",dinic(1,n));
	return 0;
}