Cod sursa(job #2427032)

Utilizator geo_furduifurdui geo geo_furdui Data 30 mai 2019 16:34:21
Problema Flux maxim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include<fstream>
#include<vector>
using namespace std;

vector<int> g[100010];
int n, m;
int cost[1001][1001];
int exces[100010];
int h[100010];

ifstream cin("maxflow.in");
ofstream cout("maxflow.out");

void read()
{
	cin >> n >> m;
	int a, b, x;
	for (int i = 1; i <= m; i++)
	{
		cin >> a >> b >> x;
		g[a].push_back(b);
		g[b].push_back(a);
		cost[a][b] = x;
	}

	h[1] = n;
	for (int i = 0; i < g[1].size(); i++)
	{
		exces[g[1][i]] = cost[1][g[1][i]];
	}
}

void preflux()
{
	while (3 > 2)
	{
		int ok=0;
		for (int i = 2; i < n; i++)
		{
			if (exces[i] > 0)
			{
				for (int j = 0; j < g[i].size(); j++)
					if (cost[i][g[i][j]] > 0 && h[g[i][j]] + 1 == h[i])
					{
						int a = cost[i][g[i][j]];
						if (exces[i] < a) a = exces[i];
						exces[i] -= a;
						cost[i][g[i][j]] -= a;
						exces[g[i][j]] += a;
						cost[i][g[i][j]] += a;
						ok = 1;
						break;
					}
				if (ok == 1) break;
			}
		}

		if (ok == 1)
			continue;
		int da = 0;
		for(int i=2;i<n;i++)
			if (exces[i] > 0)
			{
				int oki = 0, minim = 1000000000;
				for (int j = 0; j < g[i].size(); j++)
				{
					if (h[g[i][j]] < h[i]) { oki = 1; break; }
					if (h[g[i][j]] < minim) minim = h[g[i][j]];
				}
				if (oki == 0)
				{
					h[i] = minim + 1;
					da = 1;
					break;
				}
			}
		if (da == 1)
			continue;
		return;
	}
}

int main()
{
	read();
	preflux();
	cout << exces[n];
	return 0;
}