Cod sursa(job #2371694)

Utilizator Catalin_BorzaBorza Catalin-Mihai Catalin_Borza Data 6 martie 2019 19:04:19
Problema Cuplaj maxim in graf bipartit Scor 24
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>
#include <vector>
#include <map>
#include <bitset>
#include <queue>
#define N 10001
using namespace std;

ifstream f("cuplaj.in");
ofstream g("cuplaj.out");

vector<int> U[N], V[N];
map<pair<int, int>, bool> M;
bitset<N> vU, vV;
int n, m, e;

int path[N], kpath;
bitset<N> dfsU, dfsV;
bool path_dfs(int node, int k, bool set)
{
	path[k] = node;
	if (set)
	{
		if (!vV[node])
		{
			kpath = k;
			return 1;
		}
		for (auto it : V[node])
			if (!dfsU[it] && M[make_pair(it, node)])
			{
				dfsU[it] = 1;
				if (path_dfs(it, k + 1, !set)) return 1;
			}
	}
	else for (auto it : U[node])
		if (!dfsV[it] && !M[make_pair(node, it)])
		{
			dfsV[it] = 1;
			if (path_dfs(it, k + 1, !set)) return 1;
		}
	return 0;
}

int M_size;
void HK()
{
	bool ok = 1;
	while (ok)
	{
		ok = 0;
		for (int i = 1; i <= n; i++)
		{
			dfsU[i] = 1;
			if (!vU[i])
				if (path_dfs(i, 0, 0))
				{
					ok = 1;
					dfsU.reset();
					dfsV.reset();
					break;
				}
			dfsU.reset();
			dfsV.reset();
		}
		if (!ok) return;
		M_size++;
		for (int i = 0; i < kpath; i += 2)
		{
			M[make_pair(path[i], path[i + 1])] = 1;
			vU[path[i]] = vV[path[i + 1]] = 1;
		}
		for (int i = 1; i < kpath; i += 2)
			M[make_pair(path[i], path[i + 1])] = 0;
	}
}

int main()
{
	int x, y;
	f >> n >> m >> e;
	while (e--)
	{
		f >> x >> y;
		U[x].push_back(y);
		V[y].push_back(x);
	}
	HK();
	g << M_size << "\n";
	for (auto it = M.begin(); it != M.end(); ++it)
	{
		if (it->second)
			g << it->first.first << " " << it->first.second << "\n";
	}
	return 0;
}