Cod sursa(job #1856231)

Utilizator ArkinyStoica Alex Arkiny Data 24 ianuarie 2017 17:46:52
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<fstream>
#include<vector>
#include<iostream>
#include<chrono>
#include<queue>
#include<algorithm>
using namespace std;

ifstream in("maxflow.in");
ofstream out("maxflow.out");

int N, M;

int C[1010][1010];
int viz[1010];
int T[1010];
int S = 0;
queue<int> Q;
vector<int> G[1010];

bool BFS(int x)
{
	Q.push(x);

	for (int i = 1; i <= N; ++i)
		T[i] = 0, viz[i] = 0;
	viz[x] = 1;
	while (Q.size())
	{
		int e = Q.front();

		for (int i = 0; i < G[e].size(); ++i)
		{
			if (!viz[G[e][i]] && C[e][G[e][i]])
			{
				T[G[e][i]] = e;
				viz[G[e][i]] = 1;
				Q.push(G[e][i]);
			}
		}

		Q.pop();
	}
	int ok = 0;
	for (int i = 0; i < G[N].size(); ++i)
	{
		int p = G[N][i];
		if (T[p] && C[G[N][i]][N])
		{
			int mn = C[G[N][i]][N];
			while (T[p] != 0)
			{
				mn = min(mn, C[T[p]][p]);
				p = T[p];
			}

			ok = 1;

			p = G[N][i];
			C[G[N][i]][N] -= mn;
			C[N][G[N][i]] += mn;
			while (T[p] != 0)
			{
				C[T[p]][p] -= mn;
				C[p][T[p]] += mn;
				p = T[p];
			}

			S += mn;
		}
	}


	return ok;
}

int main()
{
	in >> N >> M;
	for (int i = 1; i <= M; ++i)
	{
		int x, y,w;
		in >> x >> y >> w;
		G[x].push_back(y);
		G[y].push_back(x);
		C[x][y] = w;
	}

	
	while (BFS(1)) {};

	
	out << S;
	

	return 0;
}