Cod sursa(job #1959214)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 9 aprilie 2017 11:01:25
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <cstdio>
#include <queue>
#include <vector>

using namespace std;

const int N = 1005;

int n, m;
int capacitate[N][N];
int flux[N][N];
vector<int> vecini[N];
int tati[N];

void citire()
{
	scanf("%d %d", &n, &m);

	int tmp1, tmp2, tmp3;

	for(int i = 0; i < m; i++)
	{
		scanf("%d %d %d", &tmp1, &tmp2, &tmp3);

		vecini[tmp1].push_back(tmp2);
		vecini[tmp2].push_back(tmp1);

		capacitate[tmp1][tmp2] = tmp3;
		capacitate[tmp2][tmp1] = 0;

		flux[tmp1][tmp2] = 0;
		flux[tmp2][tmp1] = 0;
	}
}

int bfs()
{
	queue<int> Q;

	Q.push(1);
	tati[1] = 1;

	while(!Q.empty())
	{
		int x = Q.front();
		int l = vecini[x].size();

		Q.pop();

		for(int i = 0; i < l; i++)
		{
			if(tati[vecini[x][i]] == 0 && flux[x][vecini[x][i]] < capacitate[x][vecini[x][i]])
			{
				tati[vecini[x][i]] = x;
				Q.push(vecini[x][i]);
			}
		}
	}

	if(tati[n] == 0)
	{
		return 0;
	}

	return 1;
}

void adaugareFlux(int x)
{
	int valMin = capacitate[x][n] - flux[x][n];
	int xx = x;

	while(tati[x] != x)	
	{
		int y = tati[x];

		int val = capacitate[y][x] - flux[y][x];

		if(val < valMin)
		{
			valMin = val;
		}

		x = tati[x];
	}

	x = xx;

	flux[x][n] += valMin;
	flux[n][x] -= valMin;

	while(tati[x] != x)	
	{
		int y = tati[x];

		flux[x][y] -= valMin;
		flux[y][x] += valMin;

		x = tati[x];
	}
}

void reinitializare()
{
	for(int i = 0; i <= n; i++)
	{
		tati[i] = 0;
	}
}

void solve()
{
	while(bfs() == true)
	{
		int l = vecini[n].size();

		for(int i = 0; i < l; i++)
		{
			if(tati[vecini[n][i]] != 0)
			{
				adaugareFlux(vecini[n][i]);
				break;
			}
		}

		reinitializare();
	}
}

void afisare()
{
	int l = vecini[n].size();
	int rezultat = 0;

	for(int i = 0; i < l; i++)
	{
		rezultat += flux[vecini[n][i]][n];
	}

	printf("%d", rezultat);
}

int main()
{
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);

	citire();
	solve();
	afisare();

	return 0;
}