Cod sursa(job #623607)

Utilizator valentina506Moraru Valentina valentina506 Data 20 octombrie 2011 13:42:11
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<fstream>
#include<vector>
#include<queue>
#include<algorithm>
#define inf 1<<30 
#define pb push_back
using namespace std;

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

int n,m,i,j,Fluxmax, Fluxct, F[1001][10001], C[1001][1001], T[1001],nod;
vector<int> G[1001];
int uz[1001];
queue<int> q;

int bf()
{
	int NOD=0;
	
	
	memset(uz,0,sizeof(uz));
	
	q.push(1);
	uz[1]=1;
	
	while(!q.empty())
	{
		NOD=q.front();
		if(NOD!=n)
		
			for(i=0;i<G[NOD].size();++i)
			if(!uz[G[NOD][i]]&& F[NOD][G[NOD][i]] < C[NOD][G[NOD][i]] )
			{
				uz[G[NOD][i]]=1;
				T[G[NOD][i]]=NOD;
				q.push(G[NOD][i]);	
			}
			q.pop();
		
	}
	return uz[n];
}

int main()
{
	int x,y,cost;
	f>>n>>m;
	for(i=1;i<=m;++i)
	{
		f>>x>>y>>cost;
		C[x][y]=cost;
		G[x].pb(y);
		G[y].pb(x);
	}
	Fluxmax=0;
	while(bf())
	{
		for(i=0;i<G[n].size();i++)
			if(uz[G[n][i]]&&F[G[n][i]][n]<C[G[n][i]] [n])
			{
				T[n]=G[n][i];
				Fluxct=inf;
				for(nod=n;nod!=1;nod=T[nod])
						Fluxct=min(Fluxct,C[T[nod]][nod]-F[T[nod]][nod]);
				if(Fluxct)
				{
					nod=n;
					for(nod=n;nod!=1;nod=T[nod])
					{
						C[T[nod]][nod]-=Fluxct;
						C[nod][T[nod]]+=Fluxct;
					}
				}
				Fluxmax+=Fluxct;
			}
			
	}
	g<<Fluxmax;
	return 0;
}