Cod sursa(job #395564)

Utilizator borsoszalanBorsos Zalan borsoszalan Data 13 februarie 2010 14:27:24
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 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&&queue[sz]!=n;i++)
		for(j=0;j<g[queue[i]].size()&&queue[sz]!=n;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();)
		{
			int 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;
}