Cod sursa(job #695615)

Utilizator maritimCristian Lambru maritim Data 28 februarie 2012 13:26:24
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<stdio.h>
#include<vector>
#include<fstream>
#include<queue>
using namespace std;

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

typedef vector<int>::iterator it;

#define MaxN 1010

int N,M,fluxTotal;
int flux[MaxN][MaxN],T[MaxN],Min[MaxN];
vector<int> A[MaxN];

void citire(void)
{
	int a,b,c;

	f >> N >> M;
	for(int i=1;i<=M;i++)
	{
		f >> a >> b >> c;
		flux[a][b] += c;
		A[a].push_back(b);
		if(a != 1)  A[b].push_back(a);
	}
}

inline int MiN(int a,int b)
{
	return a < b ? a : b;
}

inline int DF(void)
{
	queue<int> Q;
	
	for(int i=1;i<=N;i++)
		T[i] = 0, Min[i] = 12319213;
	
	for(Q.push(1);!Q.empty();Q.pop())
		for(it i=A[Q.front()].begin();i<A[Q.front()].end();i++)
			if(!T[*i] && flux[Q.front()][*i] > 0)
			{
				Q.push(*i);
				T[*i] = Q.front();
				Min[*i] = MiN(flux[Q.front()][*i],Min[Q.front()]);
				
				if(*i == N)
				{
					return 1;
				}
			}
	
	return 0;
}

void Flux(void)
{
	for(;DF();)
	{	
		for(int i=N;T[i];i=T[i])
		{
			flux[T[i]][i] -= Min[N];
			flux[i][T[i]] += Min[N];
		}
		
		fluxTotal += Min[N];
	}
}

int main()
{
	citire();
	Flux();
	
	g << fluxTotal;
	
	return 0;
}