Cod sursa(job #708765)

Utilizator Robert29FMI Tilica Robert Robert29 Data 7 martie 2012 10:12:12
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<stdio.h>
#include<vector>
using namespace std;
FILE*f=fopen("maxflow.in","r");
FILE*g=fopen("maxflow.out","w");
int p,u,ok,n,m,x,y,z,nod,sol,minn,F[1001][1001],c[1001][1001],t[1001],viz[1001],d[1001];
vector <int> v[1001];
int bfs (int nod)
{
	viz[nod]=1;
	
	p=u=1;
	d[1]=1;
	while(p<=u)
	{
		for(int i=0;i<v[d[p]].size();++i)
			if(!viz[v[d[p]][i]]&&c[d[p]][v[d[p]][i]]-F[d[p]][v[d[p]][i]]>0)
			{
				if(v[d[p]][i]==n)
					ok=1;
				else
				{
					t[v[d[p]][i]]=d[p];
					d[++u]=v[d[p]][i];
				}
				
			}
		
		
		
		++p;
	}
	
	
	return ok;
}
int main()
{
	fscanf(f,"%d%d",&n,&m);
	for(int i=1;i<=m;++i)
	{
		fscanf(f,"%d%d%d",&x,&y,&z);
		v[x].push_back (y);
		v[y].push_back (x);
		c[x][y]=z;
	}
	
	while(bfs(1))
	{
		for(int i=0;i<v[n].size();++i)
		{
			nod=v[n][i];
			minn=c[v[n][i]][n]-F[v[n][i]][n];
			for(;nod!=1;nod=t[nod])
				if(c[t[nod]][nod]-F[t[nod]][nod]<minn)
					minn=c[t[nod]][nod]-F[t[nod]][nod];
			F[v[n][i]][n]+=minn;
			F[n][v[n][i]]-=minn;
			for(nod=v[n][i];nod!=1;nod=t[nod])
			{
				F[t[nod]][nod]+=minn;
				F[nod][t[nod]]-=minn;
			}
			
			sol+=minn;
		}	
		ok=0;
		for(int i=1;i<=n;++i)
			viz[i]=0;
	}
	
	fprintf(g,"%d",sol);
	
	fclose(f);
	fclose(g);
	return 0;
}