Cod sursa(job #1008006)

Utilizator Anca_PaneaPanea Anca Anca_Panea Data 10 octombrie 2013 00:29:53
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<cstring>
#include <iostream>
#include<fstream>
#include<vector>
#define Nmax 1024
#define oo 0x3f3f3f3f
using namespace std;

ifstream eu("maxflow.in");
ofstream tu("maxflow.out");

int N,M,C[Nmax][Nmax],TT[Nmax],F[Nmax][Nmax],c[Nmax];
bool Use[Nmax];
vector<int>G[Nmax];
int BF()
{
	memset(Use,0,sizeof Use);
	int k=1;c[k]=1;
	for(int i=1;i<=k;i++)
	{
		int nod=c[i];
		if(nod==N)
            continue;
		for(unsigned int j=0;j<G[nod].size();j++)
		{
			int vecin=G[nod][j];
			if(!Use[vecin]&&C[nod][vecin]-F[nod][vecin]>0)
			{
				Use[vecin]=true;
				TT[vecin]=nod;
				c[++k]=vecin;
				if(vecin==N)
					return true;
			}

		}
	}
	return false;
}

int main()
{
	int flow,Fmin,a,b,c,nod;
	eu>>N>>M;
	for(int i=1;i<=M;i++)
	{
		eu>>a>>b>>c;
		C[a][b]+=c;
		G[a].push_back(b);
		G[b].push_back(a);
	}
	for(flow=0;BF();)
		for(unsigned int i=0;i<G[N].size();i++)
	{
		nod=G[N][i];
		if(!Use[nod]||C[nod][N]==F[nod][N])
			continue;
		TT[N]=nod;
		Fmin=oo;
		for(nod=N;nod!=1;nod=TT[nod])
			Fmin=min(Fmin,C[TT[nod]][nod]-F[TT[nod]][nod]);
		for(nod=N;nod!=1;nod=TT[nod])
		{
			F[TT[nod]][nod]+=Fmin;
			F[nod][TT[nod]]-=Fmin;
		}
		flow+=Fmin;
	}
	tu<<flow;
	return 0;
}