Cod sursa(job #2615402)

Utilizator maria_sinteaMaria Sintea maria_sintea Data 14 mai 2020 15:50:04
Problema Flux maxim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
//algoritmul Ford-Fulkerson
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define N 1005
#define INF 0x3f3f3f3f

using namespace std;

struct muchie
{
	int y, cost;
};

int n, m, t[N], flux[N][N];
vector <muchie> graf[N];

void citire()
{
	ifstream fin("maxflow.in");
	fin >> n >> m;
	for (int i = 0; i < m; i++)
	{
		int x, y, c;
		fin >> x >> y >> c;
		x--, y--;
		graf[x].push_back({ y, c});
		flux[x][y] = c;
	}
}

bool bfs()
{
	bool viz[N];
	memset(viz, 0, sizeof(viz));
	queue <int> q;
	q.push(0);
	viz[0] = true;
	t[0] = -1;

	while (!q.empty())
	{
		int u = q.front();
		q.pop();

		for (auto v : graf[u])
			if (viz[v.y] == false && flux[u][v.y] > 0)
			{
				q.push(v.y);
				t[v.y] = u;
				viz[v.y] = true;
			}
	}
	return viz[n - 1];
}

int FordFulkerson()
{
	int u, v;
	int flux_max = 0; 

	while (bfs())
	{
		int flux_drum = INF;
		for (v = n-1; v != 0; v = t[v])
		{
			u = t[v];
			flux_drum = min(flux_drum, flux[u][v]);
		}

		for (v = n-1; v != 0; v = t[v])
		{
			u = t[v];
			flux[u][v] -= flux_drum;
			flux[v][u] += flux_drum;
		}
		flux_max += flux_drum;
	}
	return flux_max;
}

int main()
{
	citire();
	ofstream fout("maxflow.out");
	int nr = FordFulkerson();
	fout << nr;
	return 0;
}