Mai intai trebuie sa te autentifici.

Cod sursa(job #325436)

Utilizator ProtomanAndrei Purice Protoman Data 20 iunie 2009 15:37:21
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <algorithm>
#include <stdio.h>
#include <deque>

#define MAX 512
#define pb push_back

using namespace std;

int n, m, s, d;
int tata[MAX];
int matCap[MAX][MAX], matFlux[MAX][MAX];

inline int bfsFlux(int source, int dest)
{
	int ok = 0;
	deque <int> queBfs;
	memset(tata, 0, sizeof(tata));

	for (queBfs.pb(source); !queBfs.empty(); queBfs.pop_front())
	{
		int nod = queBfs[0];
		ok = (nod == dest)? 1 : ok;

		for (int vecin = 1; vecin <= 502; vecin++)
			if (!tata[vecin] && (matCap[nod][vecin] > matFlux[nod][vecin]))
			{
				queBfs.pb(vecin);
				tata[vecin] = nod;
			}
	}

	return ok;
}

inline int fluxMaxim(int source, int dest)
{
	int flux = 0;

	for (; bfsFlux(source, dest); )
		for (int i = 1; i <= n; i++)
		{
			if (matCap[250 + i][dest] <= matFlux[250 + i][dest] || !tata[i])
				continue;

			int trans = matCap[250 + i][dest] - matFlux[250 + i][dest];
			for (int j = 250 + i; j != source; j = tata[j])
				trans = min(trans, matCap[tata[j]][j] - matFlux[tata[j]][j]);

			matFlux[250 + i][dest] += trans;
			matFlux[dest][250 + i] -= trans;
			for (int j = 250 + i; j != source; j = tata[j])
			{
				matFlux[tata[j]][j] += trans;
				matFlux[j][tata[j]] -= trans;
			}

			flux += trans;
		}

	return flux;
}

int main()
{
	freopen("joc4.in", "r", stdin);
	freopen("joc4.out", "w", stdout);

	scanf("%d %d %d %d", &n, &m, &s, &d);

	for (; m; m--)
	{
		int nod1, nod2;
		scanf("%d %d", &nod1, &nod2);

		matCap[250 + nod1][nod2]++;
	}
	for (int i = 1; i <= n; i++)
		matCap[i][250 + i] = 1;

	matCap[501][s] = matCap[250 + d][502] = matCap[s][250 + s] = matCap[d][250 + d] = 5000;

	printf("%d\n", fluxMaxim(501, 502));

	fclose(stdin);
	fclose(stdout);
	return 0;
}