Cod sursa(job #2749915)

Utilizator vladvlad00Vlad Teodorescu vladvlad00 Data 8 mai 2021 22:55:16
Problema Cuplaj maxim in graf bipartit Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <cstring>

using namespace std;

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

int a, b, m, uz[10005], l[10005], r[10005];
vector<int> L[10005];

bool cup(int node)
{
	if (uz[node])
		return false;
	uz[node] = true;
	for (int i : L[node])
	{
		if (r[i])
			continue;
		l[node] = i;
		r[i] = node;
		return true;
	}
	for (int i : L[node])
	{
		if (cup(r[i]))
		{
			l[node] = i;
			r[i] = node;
			return true;
		}
	}
	return false;
}

int main()
{
	cin >> a >> b >> m;
	for (int i=1;i<=m;i++)
	{
		int x, y;
		cin >> x >> y;
		L[x].push_back(a+y);
		L[a+y].push_back(x);
	}
	bool ok = true;
	while (ok)
	{
		ok = false;
		memset(uz, 0, sizeof(uz));
		for (int i = 1; i <= a; i++)
			if (!uz[i] && !l[i])
				if (cup(i))
					ok = true;
	}
	int nrsol = 0;
	for (int i = 1; i <= a; i++)
		if (l[i])
			nrsol++;
	cout << nrsol << '\n';
	for (int i = 1; i <= a; i++)
		if (l[i])
			cout << i << ' ' << l[i] - a << '\n';
    return 0;
}