Cod sursa(job #475701)

Utilizator dornescuvladVlad Eugen Dornescu dornescuvlad Data 8 august 2010 01:48:11
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define nmax 1025

using namespace std;

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

ifstream fin(iname);
ofstream fout(oname);

vector<int> nod[nmax];
queue<int> Q;
int N, M, i, a, b, c, Cap[nmax][nmax], x, F[nmax][nmax], fmin, flow, y, tata[nmax], viz[nmax];


int BFS()
{
	Q.push(1);
	memset(viz, 0, sizeof(viz));
	while(!Q.empty())
	{
		x = Q.front();
		Q.pop();
		if(x == N)
			continue;
		for(vector<int>::iterator it = nod[x].begin(); it != nod[x].end(); ++it)
		{
			if(F[x][*it] == Cap[x][*it] || viz[*it])
				continue;
			Q.push(*it);
			viz[*it] = 1;
			tata[*it] = x;
		}
	}
	return viz[N];
}
		
	
	
	

int main()
{
	fin >> N >> M;
	for(i = 1; i <= M; i ++)
	{
		fin >> a >> b >> c;
		nod[a].push_back(b);
		nod[b].push_back(a);
		Cap[a][b] = c;
	}
	for(flow = 0; BFS();)
	{
		for(vector<int>::iterator it = nod[N].begin(); it != nod[N].end(); ++ it)
		{
			if(F[*it][N] == Cap[*it][N] || !viz[*it])
				continue;
			tata[N] = *it;
			fmin = 287185781;
			for(y = N; y != 1; y = tata[y])
				fmin = min(fmin, Cap[tata[y]][y] - F[tata[y]][y]);
			for(y = N; y != 1; y = tata[y])
			{
				F[tata[y]][y] += fmin;
				F[y][tata[y]] -= fmin;
			}
			flow += fmin;
		}
	}
	fout << flow;
	return 0;
}