Cod sursa(job #703233)

Utilizator balakraz94abcd efgh balakraz94 Data 2 martie 2012 11:32:21
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
#define infile "maxflow.in"
#define outfile "maxflow.out"
#define n_max 1005
#define nxt *it
#define pb push_back
#define INF 1<<30
#define FOR(g) \
	for(vector<int> :: iterator it = g.begin(); it!=g.end(); ++it)
using namespace std;


vector <int> v[n_max];

int C[n_max][n_max], F[n_max][n_max];

int T[n_max];

queue <int> q;

int Src, Sink;

int N, M;


void citeste()
{
	freopen(infile,"r",stdin);
	
	int x, y, cost;
	
	scanf("%d %d", &N, &M);
	
	while(M--)
	{
		scanf("%d %d %d", &x, &y, &cost);
		
		v[x].pb(y);
		v[y].pb(x);
		C[x][y] = cost;
	}
	
	Src = 1;
	Sink = N;
	
	fclose(stdin);
}


int BFS()
{
	memset(T, 0, sizeof(T));
	
	q.push(Src);
	T[Src] = -1;
	
	while(!q.empty())
	{
		int x = q.front();
		q.pop();
		
		if(x == Sink)
			continue;
		
		FOR(v[x])
			if(C[x][nxt] != F[x][nxt] && !T[nxt]){
				T[nxt] = x;
				q.push(nxt);
				}
	}
	return T[Sink] != 0;
}


int MaxFlow()
{
	int Flow = 0;
	
	while(BFS())
		FOR(v[Sink]){
			
			if(F[nxt][Sink] == C[nxt][Sink] || !T[nxt])
				continue;
			
			int flow = INF;
			T[Sink] = nxt;
			
			for(int i = Sink; i != Src; i = T[i])
				flow = min(flow, C[T[i]][i] - F[T[i]][i]);
		
			if(!flow)
				continue;
			
			for(int i = Sink; i != Src; i = T[i]){
				F[T[i]][i] += flow;
				F[i][T[i]] -= flow;
			}
			
			Flow += flow;
		}
	return Flow;
}



void afiseaza()
{
	freopen(outfile,"w",stdout);
	
	printf("%d\n", MaxFlow());
	
	fclose(stdout);
}


int main()
{
	citeste();

	afiseaza();
	
	return 0;
}