Cod sursa(job #514618)

Utilizator dornescuvladVlad Eugen Dornescu dornescuvlad Data 19 decembrie 2010 11:53:20
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

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


vector<int> Gf[nmax];
int n, m, i, x, y, maxflow, mflow, c;
int C[nmax][nmax], F[nmax][nmax], T[nmax], viz[nmax];
queue<int> Q;

bool BF()
{	
	int first = 0; //inceputul cozii
	for(i = 1; i <= n; i ++)
		viz[i] = 0;
	//memset(T, 0, sizeof(T));
	Q.push(1);
	viz[1] = 1;
	while(!Q.empty())
	{	
		first = Q.front();
		Q.pop();
		for(vector<int>::iterator it = Gf[first].begin(); it != Gf[first].end(); ++ it)
		{	
			if(C[first][*it] == F[first][*it] || viz[*it])
				continue;
			T[*it] = first;
			viz[*it] = 1;
			Q.push(*it);
			if(*it == n)
				continue;
		}
	}
	return viz[n];
}


int main()
{
	fin >> n >> m;
	for(i = 1; i <= m; i ++)
	{
		fin >> x >> y >> c;
		Gf[x].push_back(y);
		Gf[y].push_back(x);
		C[x][y] = c;
	}
	
	
	maxflow = 0;
	while(BF() == 1)
	{   
		mflow = 282822;
		for(i = n; i != 1; i = T[i])
			mflow = min(mflow, C[T[i]][i] - F[T[i]][i]);
		for(i = n; i != 1; i = T[i])
		{
			F[T[i]][i] += mflow;
			F[i][T[i]] -= mflow;
		}
		maxflow += mflow;
	}
	
	fout << maxflow;
	return 0;
}