Cod sursa(job #2279465)

Utilizator manasapiMana Sapi manasapi Data 9 noiembrie 2018 16:40:38
Problema Flux maxim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.36 kb
#include <iostream>

#define N 1000


using namespace std;

int capacity[N][N]; // maximalis kapacitasok adott [i][j] ut kozott
int flow[N][N]; // aktualis folyam adott [i][j] kozott
int resi[N][N];
int nodeCount; // csomopontok szama
int edgeCount; // elek szama

void init() {
	nodeCount = edgeCount = 0;
	for (int i = 0; i < nodeCount; ++i) {
		for (int j = 0; j < nodeCount; ++j) {
			capacity[i][j] = flow[i][j] = 0;
		}
	}
}

int endNode = 3;

void beolvas() {

	freopen("maxflow.in", "rt", stdin);

	cin >> nodeCount >> edgeCount;
	endNode = nodeCount-1;
	int x, y, c;
	for (int i = 0; i < edgeCount; ++i) {
		cin >> x >> y >> c; // x csomopontbol van ut y-ba, c kapacitassal
		x--;
		y--;
		capacity[x][y] = c;
	}
}

void kiirJelenlegiFolyam() {
	return;
	for (int i = 0; i < nodeCount; ++i) {
		for (int j = 0; j < nodeCount; ++j) {
			cout << flow[i][j] << " ";
		}
		cout << "\n";
	}
	cout << "\n";
}

#define numBit(a) (1<<a)
#define min(a,b) (a<b?a:b)

int stack[N];
int stackCounter;
int maxStack;

bool inStack(int n)
{
	for (int i = 0; i < stackCounter; i++)
		if (n == stack[i]) return true;

	return false;
}

int findPath(int src, int minCap)
{
	stack[stackCounter++] = src;
	if (src == endNode)
	{
		maxStack = stackCounter-1;
		return minCap;
	}

	for(int i = 0; i<nodeCount; i++)
	{
		if (resi[src][i] != 0 && !inStack(i))
		{
			//cout << "Going from " << src << " to " << i<<" at "<<stackCounter<<"\n";
			int tmp = findPath(i,  min(minCap, resi[src][i]));
			if (tmp) return tmp;
		}
	}
	
	stackCounter--;
	return 0;

}

int megold() {
	//TO DO
	int maxFlow = 0;
	while (true)
	{

		for (int i = 0; i < nodeCount; ++i)
			for (int j = 0; j < nodeCount; ++j)
				resi[i][j] = 0;

		for (int i = 0; i < nodeCount; ++i) {
			for (int j = 0; j < nodeCount; ++j) {
				resi[i][j] += capacity[i][j]-flow[i][j];
				resi[j][i] += flow[i][j];
			}
		}

		stackCounter = 0;
		int w = findPath(0, 99999);
		//cout << "##" << w <<"\n";
		if (w == 99999) w = 0;
		if (!w) return maxFlow;
		maxFlow += w;

		for (int i = 0; i < maxStack; i++)
			flow[stack[i]][stack[i + 1]] += w;
		kiirJelenlegiFolyam();
	}
}


int main()
{
	init(); //Set to 0
	beolvas();

	int a = megold();
	kiirJelenlegiFolyam();

	freopen("maxflow.out", "wt", stdout);
	cout << a;

	

	return 0;
}