Cod sursa(job #363136)

Utilizator andrei.sfrentSfrent Andrei andrei.sfrent Data 11 noiembrie 2009 22:07:07
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

#define N 1000
#define INFINIT 1 << 30

queue<int> q; //pentru Breadth-First
int n, m;
int a[N + 1][N + 1];
int c[N + 1][N + 1];
int f[N + 1][N + 1];
int pred[N + 1];
int viz[N + 1];
int flux;

inline int min(int a, int b)
{
	if(a < b) return a;
	return b;
}

void citeste()
{
	ifstream fi("maxflow.in");
	fi >> n >> m;
	int x, y, cxy;
	for(int i = 1; i <= m; ++i)
	{
		fi >> x >> y >> cxy;
		if(c[x][y] == 0)
		{
			a[x][ ++a[x][0] ] = y;
			a[y][ ++a[y][0] ] = x;
		}
		c[x][y] += cxy;
	}
	fi.close();
}

void scrie()
{
	ofstream fo("maxflow.out");
	fo << flux << "\n";
	fo.close();
}

int BF()
{
	int i, v, e;
	
	memset(viz, 0, sizeof(viz));
	memset(pred, 0, sizeof(pred));
	
	q.push(1);
	viz[1] = 1;
	
	while(q.size() > 0)
	{
		e = q.front();
		q.pop();
		
		for(i = 1; i <= a[e][0]; ++i)
		{
			v = a[e][i];
			if(viz[v] || c[e][v] - f[e][v] == 0) continue;
			viz[v] = 1;
			pred[v] = e;
			if(v == n) continue;
			q.push(v);
		}
	}
	
	return viz[n];
}

void ford_fulkerson()
{
	int inc, i, u, nod;
	flux = 0;
	while(BF()) //inseamna ca pot mari fluxul
	{
		for(i = 1; i <= a[n][0]; ++i)
		{
			nod = a[n][i];
			
			if((!viz[nod]) || (c[nod][n] == f[nod][n])) continue;
			
			pred[n] = nod;
			
			inc = INFINIT;
			
			for(u = n; pred[u] > 0; u = pred[u]) inc = min(inc, c[pred[u]][u] - f[pred[u]][u]);
			for(u = n; pred[u] > 0; u = pred[u])
			{
				f[pred[u]][u] += inc;
				f[u][pred[u]] -= inc;
			}
			
			flux += inc;
		}
	}
}

int main()
{
	citeste();
	ford_fulkerson();
	scrie();
	return 0;
}