Cod sursa(job #540106)

Utilizator loginLogin Iustin Anca login Data 23 februarie 2011 18:37:36
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
# include <fstream>
# include <iostream>
# include <vector>
# define DIM 1024
# define INF 2121212121
using namespace std;
int n, m, F, c[DIM][DIM], f[DIM][DIM], t[DIM], v[DIM], q[DIM];
vector<int>G[DIM];

void read ()
{
	ifstream fin ("maxflow.in");
	fin>>n>>m;
	int a, b, k;
	for(int i=1;i<=m;++i)
	{
		fin>>a>>b>>k;
		c[a][b]=k;
		G[a].push_back(b);
		G[b].push_back(a);
	}
}

int BFS ()
{
	for(int i=1;i<=n;++i)v[i]=0, t[i]=0;
	q[1]=1;
	v[1]=1;
	int k, st=1, dr=1;
	while (st<=dr)
	{
			k=q[st++];
			for(vector<int>::iterator I=G[k].begin();I!=G[k].end();++I)
				if (!v[*I] && c[k][*I]>f[k][*I])
				{
					v[*I]=1;
					t[*I]=k;
					if (*I==n)
						return 1;
					q[++dr]=*I;
				}
	}
	return 0;
}

void EK ()
{
	int fmin;
	while (BFS())
	{
		fmin=INF;
		for(int i=n;i!=1;i=t[i])
			if (fmin>c[t[i]][i]-f[t[i]][i])
				fmin=c[t[i]][i]-f[t[i]][i];
		for(int i=n;t[i];i=t[i])
		{
			f[t[i]][i]+=fmin;
			f[i][t[i]]-=fmin;
		}
		F+=fmin;
	}
}
	
int main ()
{
	read ();
	EK ();
	ofstream fout ("maxflow.out");
	fout<<F;
	return 0;
}