Cod sursa(job #558723)

Utilizator dornescuvladVlad Eugen Dornescu dornescuvlad Data 17 martie 2011 13:44:37
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 char iname[] = "maxflow.in";
const char oname[] = "maxflow.out";
const int  nmax    = 1100;

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

vector<int> Gr[nmax];
int C[nmax][nmax], F[nmax][nmax], fmin, flow;
int i, j, n, x, y, c, m;
int T[nmax];
int viz[nmax];

int BFS()
{	
	
	queue<int> Q;
	int node;
	Q.push(1);
	viz[1] = 1;
	while(!Q.empty())
	{
		node = Q.front();
		Q.pop();
		for(vector<int>::iterator it = Gr[node].begin(); it != Gr[node].end(); ++it)
		{	
			if(viz[*it] == 0)
			{
				if(F[node][*it] < C[node][*it])
				{
					viz[*it] = 1;
					T[*it] = node;
					Q.push(*it);
				}
				else
					continue;
			}
			if(viz[n] == 1)
				return 1;
		}
	}
	return 0;
}

int main()
{
	fin >> n >> m;
	for(i = 1; i <= m; i ++)
	{
		fin >> x >> y >> c;
		Gr[x].push_back(y);
		Gr[y].push_back(x);
		C[x][y] = c;
	}
		
	while(BFS())
	{	
		fmin = 21899889;
		for(i = n; T[i] != 0; i = T[i])
			fmin = min(fmin, C[T[i]][i] - F[T[i]][i]);
		for(i = n; T[i] != 0; i = T[i])
		{
			F[T[i]][i] += fmin;
			F[i][T[i]] -= fmin;
		}
		flow += fmin;
		memset(T, 0, sizeof(T));
		memset(viz, 0, sizeof(viz));
	}
	fout << flow << "\n";
	return 0;
}