Cod sursa(job #566563)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 29 martie 2011 10:03:37
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <fstream>
#include <vector>
using namespace std;
#define DIM 10005

ifstream fi ("cuplaj.in");
ofstream fo ("cuplaj.out");

int N, M, E, L[DIM], R[DIM], viz[DIM], C;
vector <int> V[DIM];

int cuplaj (int n)
{
	if (viz[n]) return 0;
	viz[n] = 1;
	
	int i, v;
	for (i = 0; i < (int)V[n].size(); i++)
		if (!R[v = V[n][i]])
		{
			L[n] = v;
			R[v] = n;
			return 1;
		}
	for (i = 0; i < (int)V[n].size(); i++)
		if (cuplaj (R[v = V[n][i]]))
		{
			L[n] = v;
			R[v] = n;
			return 1;
		}
	return 0;
}

int main ()
{
	fi >> N >> M >> E;
	for (int i = 1, a, b; i <= E; i++)
	{
		fi >> a >> b;
		V[a].push_back (b);	
	}
	
	int c = 1;
	while (c)
	{
		c = 0;
		memset (viz, 0, sizeof(viz));
		for (int i = 1; i <= N; i++)
			if (!L[i])
				c += cuplaj (i);
		C += c;
	}
	
	fo << C << '\n';
	for (int i = 1; i <= N; i++)
		if (L[i]) fo << i << ' ' << L[i] << '\n';
	return 0;
}