Cod sursa(job #2615476)

Utilizator maria_sinteaMaria Sintea maria_sintea Data 14 mai 2020 17:24:58
Problema Flux maxim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
//algoritmul Edmonds-Karp
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define N 1005
#define INF 0x3f3f3f3f

using namespace std;

int n, m, t[N], flux[N][N], cost[N][N];
vector <int> 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);
		cost[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] == false && flux[u][v] < cost[u][v] && v != 0)
			{
				q.push(v);
				t[v] = u;
				viz[v] = 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, cost[u][v] - 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;
}