Cod sursa(job #316314)

Utilizator alex.cepoiAlexandru Cepoi alex.cepoi Data 19 mai 2009 04:34:40
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <memory.h>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;

#define nmax 1001
int N,S,T;

vector <int> V[nmax];
int c[nmax][nmax];
int f[nmax][nmax];

int pre[nmax];
bool viz[nmax];			// TODO: bitset!!

bool bfs ()
{
	memset (pre,0,(N+1)*sizeof(int));
	memset (viz,0,(N+1)*sizeof(bool));		// TODO: viz.reset() !!

	queue <int> Q;
	Q.push (S), viz[S] = 1;

	while (Q.size())
	{
		int x = Q.front(); Q.pop();
		if (x == T) continue;

		for (vector<int>::iterator i=V[x].begin(); i!=V[x].end(); ++i)
			if (c[x][*i] > f[x][*i] && !viz[*i])
			{
				Q.push (*i); viz[*i] = 1;
				pre[*i]=x;
			}
	}

	return viz[T];
}

int getmin ()
{
	int min = c[pre[T]][T] - f[pre[T]][T];
	for (int i=pre[T]; i!=S; i=pre[i])
		if (min > c[pre[i]][i] - f[pre[i]][i])
			min = c[pre[i]][i] - f[pre[i]][i];

	return min;
}

int flux ()
{
	int flux = 0;

	while (bfs())
	{
		for (vector<int>::iterator i=V[T].begin(); i!=V[T].end(); ++i)
			if (c[*i][T] > f[*i][T] && viz[*i])
			{
				pre[T] = *i;
				int cf = getmin ();
				if (!cf) continue;

				for (int i=T; i!=S; i=pre[i])
				{
					f[pre[i]][i] += cf;
					f[i][pre[i]] -= cf;
				}
				flux += cf;
			}
	}

	return flux;
}

void read ()
{
	int M;
	cin>>N>>M;

	while (M--)
	{
		int x,y,z;
		cin>>x>>y>>z;
		c[x][y]+=z;
		V[x].push_back(y),V[y].push_back(x);
	}
}

int main ()
{
	freopen ("maxflow.in","r",stdin);
	freopen ("maxflow.out","w",stdout);

	read (); S=1, T=N;
	cout<<flux()<<'\n';

	return 0;
}