Cod sursa(job #3320308)

Utilizator Ruxandra009Ruxandra Vasilescu Ruxandra009 Data 4 noiembrie 2025 21:10:00
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#include <vector>
#include <bitset>

using namespace std;

const string txt = "cuplaj";
const int nmax = 1e4 + 5;

ifstream f(txt + ".in");
ofstream g(txt + ".out");

int n1, n2, m, p1[nmax], p2[nmax], viz[nmax];
vector<int> v[nmax];

static bool mbm(int node)
{
	if (viz[node]) return false;

	viz[node] = 1;
	for(auto x : v[node])
		if (!p2[x]) {
			p2[x] = node; p1[node] = x;
			
			return true;
		}

	for(auto x : v[node])
		if (mbm(p2[x])) {
			p2[x] = node; p1[node] = x;

			return true;
		}

	return false;
}

static int cuplaj_max()
{
	int oki = 1;
	while (oki)
	{
		oki = 0;
		for (int i = 1; i <= n1; i++) viz[i] = 0;

		for (int i = 1; i <= n1; i++)
			if (!p1[i]) oki += mbm(i);
	}

	int ans = 0;
	for (int i = 1; i <= n1; i++)
		if (p1[i]) ans++;

	return ans;
}

int main()
{
	f.tie(NULL);
	f >> n1 >> n2 >> m;
	for (int i = 1; i <= m; i++)
	{
		int x, y; f >> x >> y;
		v[x].push_back(y);
	}

	g << cuplaj_max() << '\n';
	for (int i = 1; i <= n1; i++)
		if (p1[i]) 
			g << i << " " << p1[i] << '\n';
	return 0;
}