Cod sursa(job #557771)

Utilizator siminescuPaval Cristi Onisim siminescu Data 16 martie 2011 20:44:38
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<fstream>
#include<vector>
#include<iterator>
#include<queue>
using namespace std;

ifstream f("maxflow.in");
ofstream g("maxflow.out");

# define nmax 1002
#define INF 110002
# define Min(a,b) ((a)<(b)? (a):(b))

int N,M,t[nmax],F[nmax][nmax],cap[nmax][nmax];
vector <int> v[nmax];
queue <int> Q;

void citire()
{
	f>>N>>M;
	int i,j,c;
	for(;M;--M)
		f>>i>>j>>c,
		v[i].push_back(j),
		cap[i][j]=c;
}
int BF(int sursa,int dest)
{
	bool viz[nmax];
	memset(viz,0,sizeof(viz));
	memset(t,0,sizeof(t));
	Q.push(sursa); viz[sursa]=1;
	int nod;
	vector <int>::const_iterator it;
	while(!Q.empty())
	{
		nod=Q.front();
		Q.pop();
		for(it=v[nod].begin();it<v[nod].end();++it)
			if(cap[nod][*it]-F[nod][*it]>0 && !viz[*it])
				t[*it]=nod,
				Q.push(*it),
				viz[*it]=1;
	}
	if(t[dest])
		return 1;
	return 0;
}
int edmond_karp(int sursa,int dest)
{
	int flux=0,m,i;
	while(BF(sursa,dest))
	{
		m=INF;
		for(i=dest;i!=sursa;i=t[i])
			m=Min(m,cap[t[i]][i]-F[t[i]][i]);
		flux+=m;
		for(i=dest;i!=sursa;i=t[i])
			F[t[i]][i]+=m;
	}
	return flux;
}
int main()
{
	citire();
	g<<edmond_karp(1,N);
}