Cod sursa(job #1549358)

Utilizator koroalinAlin Corodescu koroalin Data 12 decembrie 2015 11:41:25
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>
#include <vector>
#define NMAX 20004
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
vector <int> G[NMAX];
int n, na;
int c[NMAX], viz[NMAX];
int dfs(int x);
int main()
{
	int x, y,m,a,b;
	fin >> x >> y;
	n = x + y; na = x;
	fin >> m;
	while (m)
	{
		fin >> a >> b;
		b += na;
		G[a].push_back(b);
		G[b].push_back(a);
		m--;
	}
	int ok = 1;
	while (ok)
	{
		ok = 0; 
		for (int i = 1; i <= n; i++)
			viz[i] = 0;
		for (int i = 1; i <= na; i++)
			if (!viz[i] && !c[i])
				if (dfs(i) ) ok = 1;
	}

	int nr = 0;
	for (int i = 1; i <= na; i++)
		if (c[i]) nr++;

	fout << nr << '\n';
	for (int i = 1; i <= na; i++)
		if (c[i])
			fout << i << ' ' << c[i] - na << '\n';
}
int dfs(int x)
{
	viz[x] = 1;
	for (int i = 0; i < G[x].size(); i++)
	{
		int k = G[x][i];
		if (viz[k] || c[x] == k) continue;
		if (c[k] == 0)
		{
			viz[k] = 1; c[k] = x; c[x] = k; return 1;
		}
		viz[k] = 1;
		if (dfs(c[k]))
		{
				c[x] = k; c[k] = x; return 1;
		}
	}
	return 0;
}