Cod sursa(job #395881)

Utilizator borsoszalanBorsos Zalan borsoszalan Data 13 februarie 2010 22:31:04
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<stdio.h>
#include<vector>
#include<algorithm>
#define nmax 1502

using namespace std;

vector<int> g[nmax];
int c[nmax][nmax], f[nmax][nmax];

int n,m,i,j,x,y,z;
long int flow=0;
int viz[nmax], queue[nmax], sz, tata[nmax];

int BFS()
{
	memset(viz, 0, sizeof(viz));
	viz[1]=1;
	queue[0]=1;
	sz=1;
	queue[1]=1;
	for(i=1;i<=sz;i++)
		for(j=0;j<g[queue[i]].size();j++)
			if(c[queue[i]][g[queue[i]][j]]>f[queue[i]][g[queue[i]][j]]&&!viz[g[queue[i]][j]])
			{
				viz[g[queue[i]][j]]=1;
				queue[++sz]=g[queue[i]][j];
				tata[g[queue[i]][j]]=queue[i];
				queue[0]=sz;
			}
	return viz[n];
}

int min(int a, int b)
{
	if(a>b)
		return b;
	else return a;
}

int main()
{
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	scanf("%d %d", &n, &m);
	for(i=1;i<=m;i++)
	{
		scanf("%d %d %d", &x, &y, &z);
		c[x][y]=z;
		g[x].push_back(y);
		g[y].push_back(x);
	}
	for(;BFS();)
		for(i=0;i<g[n].size();i++)
		{
			int nod=g[n][i];
			if(f[nod][n]==c[nod][n]||!viz[nod]) continue;
			tata[n] = nod;
			long int fmin=99999999;
			for(nod=n;nod>1;nod=tata[nod])
				fmin=min(fmin, c[tata[nod]][nod]-f[tata[nod]][nod]);
			for(nod=n;nod>1;nod=tata[nod])
			{
				f[tata[nod]][nod]+=fmin;
				f[nod][tata[nod]]-=fmin;
			}
			flow+=fmin;
		}
	printf("%ld\n", flow);
	return 0;
}