Cod sursa(job #2658102)

Utilizator SilviuIIon Silviu SilviuI Data 13 octombrie 2020 11:46:47
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <vector>
#include <queue>
#define pb push_back

using namespace std;

int n, m;
int dad[1010];
int capc[1010][1010], flux[1010][1010];
bool fr[1010];
vector <int> g[1010];

bool bfs()
{
	for (int i = 1; i <= n; i++) fr[i] = false;
	
	fr[1] = true;
	queue <int> que;
	
	que.push(1);
	
	while (!que.empty())
	{
		int node = que.front(); que.pop();
		
		if (node == n) continue;
		
		for (auto x: g[node])
			if (!fr[x] && capc[node][x] != flux[node][x]) {
				
				dad[x] = node;
				que.push(x); fr[x] = true;
			}
	}
	
	return (fr[n]);
}

int main() 
{
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	
	cin >> n >> m;
	
	for (int i = 1; i <= m; i++) {
		
		int x, y, z;
		
		cin >> x >> y >> z;
		
		g[x].pb(y);
		g[y].pb(x);
		
		capc[x][y] += z;
	}
	
	int f_max = 0;
	
	while (bfs())
	{
		
		for (auto x: g[n]) 
		if (fr[x] && capc[x][n] != flux[x][n]) {
			
			int f_min = 1e9; dad[n] = x;
			
			for (int j = n; j > 1; j = dad[j])
				f_min = min(f_min, capc[dad[j]][j] - flux[dad[j]][j]);
				
			if (f_min == 0) continue;
			
			for (int j = n; j > 1; j = dad[j]) {
				
				flux[dad[j]][j] += f_min;
				flux[j][dad[j]] -= f_min;
			}
			
			f_max += f_min;
		}
	}
	
	cout << f_max;
	
	return 0;
}