Cod sursa(job #1833696)

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

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

vector<int> vec[10010];

int Left[10010], Right[10010], viz[10010];

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

	for (int i = 0; i < vec[x].size(); ++i)
	{
		if (!viz[Right[vec[x][i]]] && cuplaj(Right[vec[x][i]]) == true)
		{
			Left[x] = vec[x][i];
			Right[vec[x][i]] = 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;
		for (int i = 1; i <= n1; ++i)
		{
			if (Left[i] == 0 && cuplaj(i))
			{
				++nr;
				ok = 1;

				for (int i = 1; i <= n1; ++i)
					viz[i] = 0;

			}
		}


	} while (ok);

	out << nr << "\n";

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


	return 0;
}