Cod sursa(job #2820221)

Utilizator oaspruOctavian Aspru oaspru Data 20 decembrie 2021 07:37:13
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <stdio.h>
#include <vector>
#include <assert.h>
#include <set>

using namespace std;

#define maxn 10010

int n, m, e, draw, sol;
vector <int> a[maxn];
int g[maxn];
int u[maxn], mark[maxn], c[maxn];
// set < pair <int, int > > S;

int DFS(int nod)
{
	if (u[nod]==draw) return 0;

	u[nod] = draw;
	int i;

	for (i=0; i<g[nod]; i++)
		if (mark[a[nod][i]]==-1 || DFS(mark[a[nod][i]]))
		{
			c[nod] = a[nod][i];
			mark[a[nod][i]] = nod;
			return 1;
		}

	return 0;
}

void cuplaj()
{
	memset(mark, -1, sizeof(mark));

	int last = -1, i;

	while (last != sol)
	{
		last = sol;

		draw++;
		for (i=1; i<=n; i++)
			if (!c[i]) sol += DFS(i);
	}
}

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

	int i, x, y;

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

	assert(1 <= n && n <= 10000);
	assert(1 <= m && m <= 10000);
	assert(1 <= e && e <= 100000 && e <= n*m);

	for (i=1; i<=e; i++)
	{
		scanf("%d %d ", &x, &y);

		assert(1 <= x && x <= n);
		assert(1 <= y && y <= m);

		a[x].push_back(y);

//		assert(S.find( make_pair(x, y)) == S.end());
//		S.insert( make_pair(x, y));
	}

	for (i=1; i<=n; i++) g[i] = a[i].size();

	cuplaj();

	printf("%d\n", sol);

	for (i=1; i<=n; i++)
		if (c[i]) printf("%d %d\n", i, c[i]);

	return 0;
}