Cod sursa(job #252783)

Utilizator yoyolichIoana Ardeleanu yoyolich Data 4 februarie 2009 21:55:54
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include<stdio.h>
#include<vector>
#define nmax 1024
#define oo 0x3f3f3f3f
using namespace std;

int n,m,C[nmax][nmax],viz[nmax],flow,fmin,x,y,z,tata[nmax],F[nmax][nmax],i;
int Q[nmax];
vector<int> G[nmax];

#define DIM 8192

char ax[DIM+16];
int pz;

inline void cit(int &x)
{
            x=0;
            while((ax[pz]<'0' || ax[pz]>'9') && (ax[pz]!='-'))
                        if(++pz==DIM)fread(ax, 1, DIM, stdin), pz=0;
           
            int neg=0;
            if(ax[pz]=='-')
            {
                        neg=1;
                        if(++pz==DIM)fread(ax, 1, DIM, stdin),pz=0;
            }
           
            while(ax[pz]>='0' && ax[pz]<='9')
            {
                        x=x*10+ax[pz]-'0';
                        if(++pz==DIM)fread(ax,1, DIM, stdin),pz=0;
            }
            if(neg) x=-x;
}

inline int bfs()
{
	int prim, ultim,x,i;

	memset(viz,0,sizeof(viz));
	prim=ultim=0;
	Q[0]=1;
	viz[1]=1;
	while(prim<=ultim)
	{
		x=Q[prim++];
		if(x==n) continue;
		for(i=0;i<G[x].size();i++)
				{
					if (C[x][G[x][i]] == F[x][G[x][i]] || viz[G[x][i]]) continue;  
					Q[++ultim]=G[x][i];
					tata[G[x][i]]=x;
					viz[G[x][i]]=1;
				}
	}
	return viz[n];
}

int main()
{

	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	cit(n);cit(m);
	for(i=1;i<=m;i++)
	{
		cit(x);cit(y);cit(z);
		G[x].push_back(y);
		G[y].push_back(x);
		C[x][y]+=z;
	}
	
	flow=0;
	while(bfs())
	   for(i=0;i<G[n].size();i++)
		{
		if (F[G[n][i]][n] == C[G[n][i]][n] || !viz[G[n][i]]) continue;
		tata[n]=G[n][i];
		
		fmin=oo;
		for(i=n;i!=1;i=tata[i])
		{
			fmin=min(fmin, C[tata[i]][i]-F[tata[i]][i]);
		}
		if (fmin == 0) continue;
		
		for(i=n;i!=1;i=tata[i])
		{
			F[tata[i]][i]+=fmin;
			F[i][tata[i]]-=fmin;
		}
		
		flow+=fmin;
	}

	printf("%d\n",flow);
	
	return 0;
}