Cod sursa(job #1457980)

Utilizator LegionHagiu Stefan Legion Data 5 iulie 2015 13:13:33
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int ocupat[10001];
int bun[10001];
int folosit[10001];
vector<int> stanga[10001];
int n, m, k;
int acum;
int cuplaj(int i)
{
	int j;
	for (j = 0; j < stanga[i].size(); j++)
	{
		if (ocupat[stanga[i][j]] == 0)
		{
			ocupat[stanga[i][j]] = i;
			return 1;
		}
	}
	for (j = 0; j < stanga[i].size(); j++)
	{
		if (folosit[ocupat[stanga[i][j]]] != acum)
		{
			folosit[ocupat[stanga[i][j]]] = acum;
			if (cuplaj(ocupat[stanga[i][j]]) == 1)
			{
				ocupat[stanga[i][j]] = i;
				return 1;
			}
		}
	}
	return 0;
}
void rez()
{
	int i,j;
	for (i = 1; i <= n; i++)
	{
		for (j = 0; j < stanga[i].size(); j++)
		{
			if (ocupat[stanga[i][j]] == 0)
			{
				ocupat[stanga[i][j]] = i;
				bun[i] = 1;
				break;
			}
		}
	}
	for (i = 1; i <= n; i++)
	{
		if (bun[i] == 0)
		{
			folosit[i] = i;
			acum = i;
			cuplaj(i);
		}
	}
}
int main()
{
	ifstream in("cuplaj.in");
	ofstream out("cuplaj.out");
	int i,x,y;
	in >> n >> m >> k;
	for (i = 1; i <= k; i++)
	{
		in >> x;
		in >> y;
		stanga[x].push_back(y);
	}
	rez();
	int total = 0;
	for (i = 1; i <= m; i++)
	{
		if (ocupat[i] > 0)
		{
			total++;
		}
	}
	out << total<<"\n";
	for (i = 1; i <= m; i++)
	{
		if (ocupat[i] > 0)
		{
			out << ocupat[i] << " " << i<<"\n";
		}
	}
}