Cod sursa(job #1438916)

Utilizator VladutZ94FMI Chichirau Vlad Vasile VladutZ94 Data 21 mai 2015 04:21:53
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 200001

std::vector<int> graf[NMAX];
int l, r, m;
int pair[NMAX], vizitat[NMAX];

bool join(int nod, int color)
{
	vizitat[nod] = color;
	for (int i = 0; i < graf[nod].size(); i++)
	{
		if (vizitat[graf[nod][i]] != color)
		{
			vizitat[graf[nod][i]] = color;
			if (pair[graf[nod][i]] == 0 || join(pair[graf[nod][i]], color) == 1)
			{
				pair[nod] = graf[nod][i];
				pair[graf[nod][i]] = nod;
				return true;
			}
		}
	}
	return false;
}

int main()
{
	std::ifstream f("cuplaj.in");
	int a, b;
	int color = 0, perechi = 0;
	f >> l >> r >> m;
	for (int i = 1; i <= m; i++)
	{
		f >> a >> b;
		b = b + l;
		graf[a].push_back(b);
		graf[b].push_back(a);
	}
	bool ok = true;
	while (ok == true)
	{
		color++;
		ok = false;
		for (int i = 1; i <= l; i++)
		{
			if (pair[i] == 0)
			{
				if (join(i, color) == 1)
				{
					perechi++;
					ok = true;
				}
			}
		}
	}
	std::ofstream g("cuplaj.out");
	g << perechi << "\n";
	for (int i = 1; i <= l; i++)
	{
		if (pair[i] != 0)
		{
			g << i << " " << pair[i] - l << "\n";
		}
	}

	return 0;
}