Cod sursa(job #1833702)

Utilizator ArkinyStoica Alex Arkiny Data 22 decembrie 2016 22:20:53
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<fstream>
#include<vector>
#include<bitset>
using namespace std;

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

vector<int> vec[10010];

int Left[10010], Right[10010];

bitset<10010> viz;

bool cuplaj(int x)
{
	viz[x] = 1;
	for (int i = 0; i < vec[x].size(); ++i)
	{
		int a = vec[x][i];
		if (Right[a] == 0)
		{
			Right[a] = x;
			Left[x] = a;
			return true;
		}
	}

	for (int i = 0; i < vec[x].size(); ++i)
	{
		int a = vec[x][i];
		if (viz[Right[a]]==0 && cuplaj(Right[a]) == true)
		{
			Left[x] = a;
			Right[a] = x;
			return true;
		}
	}

	return false;
}

int main()
{

	int n1, n2, m;


	in >> n1 >> n2 >> m;

	for (int i = 1; i <= m; ++i)
	{
		int x, y;

		in >> x >> y;

		vec[x].push_back(y);
	}

	int ok, nr = 0;
	do
	{
		ok = 0;
		viz.reset();
		for (int i = 1; i <= n1; ++i)
		{
			if (Left[i] == 0 && cuplaj(i))
			{
				++nr;
				ok = 1;

			}
		}


	} while (ok);

	out << nr << "\n";

	for (int i = 1; i <= n1; ++i)
		if(Left[i])
			out << i << " " << Left[i] << "\n";


	return 0;
}