Cod sursa(job #562467)

Utilizator ChallengeMurtaza Alexandru Challenge Data 23 martie 2011 09:15:52
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#include <list>
#include <queue>
#include <cstring>

using namespace std;

const char InFile[]="maxflow.in";
const char OutFile[]="maxflow.out";
const int MaxN=1024;
const int INF=1<<30;

ifstream fin(InFile);
ofstream fout(OutFile);

int N,M,maxflow,x,y,z,C[MaxN][MaxN],F[MaxN][MaxN],T[MaxN];
list<int> A[MaxN];

inline bool BFS()
{
	bool ok=false;
	int V[MaxN];
	memset(V,0,sizeof(V));
	
	V[1]=1;
	queue<int> q;
	q.push(1);
	while(!q.empty())
	{	
		int nod=q.front();
		q.pop();
		V[nod]=1;
		for(list<int>::iterator it=A[nod].begin();it!=A[nod].end();++it)
		{
			if(*it==N)
			{
				ok=true;
				continue;
			}
			if(!V[*it] && C[nod][*it]>F[nod][*it])
			{
				T[*it]=nod;
				q.push(*it);
			}
		}
	}
	return ok;
}

inline int flux()
{
	int flow=0;
	while(BFS())
	{
		for(list<int>::iterator it=A[N].begin();it!=A[N].end();++it)
		{
			int nod=*it;
			int minim=C[nod][N]-F[nod][N];
			while(nod!=1)
			{
				minim=min(minim,C[T[nod]][nod]-F[T[nod]][nod]);
				nod=T[nod];
			}
			nod=*it;
			F[nod][N]+=minim;
			F[N][nod]-=minim;
			while(nod!=1)
			{
				F[T[nod]][nod]+=minim;
				F[nod][T[nod]]-=minim;
				nod=T[nod];
			}
			
			flow+=minim;
		}
	}
	return flow;
}

int main()
{
	fin>>N>>M;
	for(register int i=1;i<=M;++i)
	{
		fin>>x>>y>>z;
		C[x][y]=z;
		A[x].push_back(y);
		A[y].push_back(x);
	}
	fin.close();
	
	maxflow=flux();
	
	fout<<maxflow;
	fout.close();
	return 0;
}