Cod sursa(job #2608867)

Utilizator r00t_Roman Remus r00t_ Data 1 mai 2020 20:17:17
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <fstream>

using namespace std;

#define ff first
#define ss second

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

int mp[1115][1115], parent[10000];
bool viz[10000], notSource[10000], notSink[10000];
int n, m;

queue<pair<int, int>>edges;

bool bfs(int source, int sink)
{
	for (int i = 1; i <= n; i++)viz[i] = 0, parent[i] = 0;
	bool reached = 0;

	queue<int>q;
	q.push(source);
	viz[source] = 1;
	parent[source] = source;
	while (!q.empty())
	{
		int crt = q.front();
		q.pop();
		viz[crt] = 1;

		for (int i = 1; i <= n; i++)
		{
			if (viz[i])continue;
			if (mp[crt][i] > 0)
			{
				if (i == sink)
				{
					reached = 1;
					edges.push({ crt,i });
					continue;
				}
				q.push(i);
				parent[i] = crt;
				viz[i] = 1;

				
			}
			
		}
		
	}



	return reached;
}


int edmondsKarp(int source, int sink)
{
	int rez = 0;
	while (bfs(source, sink))
	{
		while (!edges.empty())
		{
			int a = edges.front().ff, b = edges.front().ss;
			
			int Min = 10000000;
			Min = min(Min, mp[a][b]);
			while (a != parent[a])
			{
				b = a;
				a = parent[a];
				Min = min(Min, mp[a][b]);
			}

			a = edges.front().ff, b = edges.front().ss;
			mp[a][b] -= Min;
			mp[b][a] += Min;
			while (a != parent[a])
			{
				b = a;
				a = parent[a];
				mp[a][b] -= Min;
				mp[b][a] += Min;
			}

			rez += Min;
			edges.pop();
		}
	}


	return rez;
}


int main()
{
	ios::sync_with_stdio(false);
	int source, sink;
	fin >> n >> m;
	for (int i = 0; i < m; i++)
	{
		int a, b, w;
		fin >> a >> b >> w;
		mp[a][b] = w;
		notSink[a] = 1;
		notSource[b] = 1;
	}

	for (int i = 1; i <= n; i++) {
		if (!notSink[i])
			sink = i;
		if (!notSource[i])
			source = i;
	}
	fout << edmondsKarp(source, sink);

}