Cod sursa(job #582530)

Utilizator pykhNeagoe Alexandru pykh Data 15 aprilie 2011 14:59:29
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<cstdio>
#include<queue>
#include<bitset>
using namespace std;

const char in[]="maxflow.in";
const char out[]="maxflow.out";

const int Max_N = 1050;

bitset<Max_N>viz;
queue<int>Q;
vector<int>G[Max_N];

int C[Max_N][Max_N], F[Max_N][Max_N], flow, min_flow, T[Max_N];
int N, M;

bool BF()
{
	while(Q.size())Q.pop();
	viz.reset();
	Q.push(1);
	viz[1] = true;
	
	while(Q.size())
	{
		int nod = Q.front();
		Q.pop();
		for(unsigned i = 0 ; i < G[nod].size() ; ++i)
		{
			int x = G[nod][i];
			if(!viz[x] && C[nod][x] - F[nod][x] > 0)
			{
				T[x] = nod;
				Q.push(x);
				viz[x] = true;
				if(x == N) return true;
			}
		}
	}
	return viz[N];
}

int main()
{
	freopen(in,"r",stdin);
	freopen(out,"w",stdout);

	scanf("%d %d", &N, &M);
	
	for(int i = 1 ; i <= M ; ++i)
	{
		int x, y, cap;
		scanf("%d %d %d", &x, &y, &cap);
		G[x].push_back(y);
		G[y].push_back(x);
		C[x][y] = cap;
	}
	
	while(BF())
	{
		for(unsigned i = 0 ; i < G[N].size() ; ++i)
		{
			int x = G[N][i];
			if(F[x][N] == C[x][N] || !viz[x])continue;
			
			T[N] = x;
			min_flow = 0x3f3f3f3f;
			for(int i = N ; i != 1; i = T[i])
				min_flow= min(min_flow, C[T[i]][i] - F[T[i]][i]);
			
			for(int i = N ; i != 1; i = T[i])
			{
				F[T[i]][i] += min_flow;
				F[i][T[i]] -= min_flow;
			}
			flow += min_flow;
		}
	}
	printf("%d\n", flow);
	
	return 0;
	
}