Cod sursa(job #2397946)

Utilizator LazarRazvanLazar Razvan LazarRazvan Data 4 aprilie 2019 21:47:52
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
//============================================================================
// Name        : Hopcroft-Karp.cpp
// Author      : Razvan
// Version     :
// CopyRight   : Your copyRight notice
// Description : Cuplaj maxim in graf bipartit (nr maxim de muchii care conecteaza nodurile din prima multime cu cele din a 2-a multime, fara ca unui nod sa ii fie atribuit 2 sau mai multe noduri)
//============================================================================

#include <iostream>
#include <fstream>
#include <vector>

#define Nmax 10005

using namespace std;

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

vector <int> G[Nmax];

int N, M, E;
bool Miscare, Used[Nmax];
int Left[Nmax], Right[Nmax];

void Read()
{
	int x, y;
	fin >> N >> M >> E;
	for (int i=1; i<=E; i++)
	{
		fin >> x >> y;
		G[x].push_back(y);
	}
}

void InitUsed()
{
	for (int i=1; i<=N; i++)
		Used[i] = false;
}

bool Cupleaza(int Nod)
{
	if (Used[Nod] == true)
		return false;
	Used[Nod] = true;
	for (unsigned int i=0; i<G[Nod].size(); i++)
	{
		int Vecin = G[Nod][i];
		if (Right[Vecin] == 0)
		{
			Left[Nod] = Vecin;
			Right[Vecin] = Nod;
			return true;
		}
	}
	for (unsigned int i=0; i<G[Nod].size(); i++)
	{
		int Vecin = G[Nod][i];
		if (Cupleaza(Right[Vecin]))
		{
			Left[Nod] = Vecin;
			Right[Vecin] = Nod;
			return true;
		}
	}
	return false;
}

int main() {
	Read();
	Miscare = true;
	while (Miscare == true)
	{
		Miscare = false;
		InitUsed();
		for (int i=1; i<=N; i++)
		{
			if (Left[i] == 0)
				if (Cupleaza(i) == true)
					Miscare = true;
		}
	}
	int nrCuplaje = 0;
	for (int i=1; i<=N; i++)
		if (Left[i] > 0)
			nrCuplaje++;
	fout << nrCuplaje << '\n';
	for (int i=1; i<=N; i++)
	{
		if (Left[i] > 0)
			fout << i << " " << Left[i] << '\n';
	}
	return 0;
}