Cod sursa(job #998200)

Utilizator Cosmin1490Balan Radu Cosmin Cosmin1490 Data 16 septembrie 2013 04:13:03
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.29 kb
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <iterator>
using namespace std;

const string file = "maxflow";

const string infile = file + ".in";
const string outfile = file + ".out";

const int INF = 0x3f3f3f3f;

int MaxFlow;
int N, M;


vector<vector<int> > Flux;
vector<vector<int> > Cap;
vector<vector<int> > G;

vector<int> prec;
vector<bool> uz;
int S;
int T;


bool bfs(int x)
{
	uz.clear();
	uz.resize(N + 1);
	queue<int> q;
	q.push(x);

	uz[S] = true;

	while(q.empty() == false)
	{
		int c = q.front();
		q.pop();

		if ( c == T)
			return true;
		
		for(vector<int>::iterator itr = G[c].begin();
			itr != G[c].end();
			itr++)
		{
			if(uz[*itr] == true)
				continue;
			if(Cap[c][*itr] - Flux[c][*itr] > 0)
			{
				uz[*itr] = true;
				q.push(*itr);
				prec[*itr] = c;
			}
		}
	}
	return false;
}

int main()
{
	fstream fin(infile.c_str(), ios::in);
	fin >> N >> M;
	T = N;
	S = 1;
	prec.resize(N + 1);
	Flux.resize(N + 1, vector<int>(N + 1));
	Cap.resize(N + 1, vector<int>(N + 1));

	G.resize(N + 1);
	for(int i = 0; i < M; i++)
	{
		int x, y, c;
		fin >> x >> y >> c;
		G[x].push_back(y);
		G[y].push_back(x);
		Cap[x][y] = c;
	}
	fin.close();



	while(bfs(1))
	{
		for(vector<int>::iterator itr = G[T].begin();
			itr != G[T].end();
			itr++)
		{
			if(uz[*itr] && Cap[*itr][T] - Flux[*itr][T] > 0)
			{
				prec[T] = *itr;

				int minflow = INF;
				for(int n = T; n != 1; n = prec[n])
				{
					minflow = min(minflow, Cap[prec[n]][n] - Flux[prec[n]][n]); 
				}

				if(minflow == 0)
					continue;

				MaxFlow += minflow;

				for(int n = T; n != 1; n = prec[n])
				{
					Flux[prec[n]][n] += minflow; 
					Flux[n][prec[n]] -= minflow;
				}


			}
		}
	}


	fstream fout(outfile.c_str(), ios::out);
	fout << MaxFlow << "\n";
	fout.close();
}