Cod sursa(job #2085996)

Utilizator simaghitaSima Gheorghe Eugen simaghita Data 10 decembrie 2017 23:17:27
Problema Cuplaj maxim in graf bipartit Scor 24
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <map>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <bitset>
#include<thread>

using namespace std;
const int n = 10010;
vector<int> L[n];
int Left[n], Right[n];
bool viz[n];
int lNum, rNum, eNum;


bool DFS(int currentNode) 
{
	if (viz[currentNode])
		return false;
	viz[currentNode] = true;
	int lg = L[currentNode].size();
	for (int i = 0; i < lg; ++i)
	{
		int node = L[currentNode][i];
		if (!Left[node]) //nu este cuplat
		{
			Left[node] = currentNode;
			Right[currentNode] = node;
			return true;
		}
	}

	for (int i = 0; i < lg; ++i) 
	{
		int node = L[currentNode][i];
		if (DFS(node))
		{
			Left[node] = currentNode;
			Right[currentNode] = node;
			return true;
		}
	}
	return false;

}

void Hopcroft_Karp()
{
	bool finish = false;
	while (!finish)
	{
		finish = true;
		for (int i = 1; i <= lNum; ++i)
			viz[i] = false;
		for (int i = 1; i <= lNum; ++i)
		{
			if (!Right[i])
			{
				if (DFS(i))
					finish = false;
			}
		}
	}
}

int main()
{
	ifstream fin("cuplaj.in");
	fin >> lNum >> rNum >> eNum;
	int x, y;
	for (int i = 0; i < eNum; ++i)
	{
		fin >> x >> y;
		L[x].push_back(y);
	}

	Hopcroft_Karp();
	
	ofstream fout("cuplaj.out");
	int rez = 0;

	for (int i = 1; i <= lNum; ++i)
	{
		if (Right[i])
			rez++;
	}
	fout << rez << "\n";
	for (int i = 1; i <= lNum; ++i)
	{
		if (Right[i])
			fout << i << " " << Right[i] << "\n";
	}
	fin.close();
	fout.close();

	return 0;
}