Cod sursa(job #302879)

Utilizator floringh06Florin Ghesu floringh06 Data 9 aprilie 2009 13:08:09
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <cstdio>
#include <vector>

using namespace std;

#define FIN "cuplaj.in"
#define FOUT "cuplaj.out"
#define MAX_N 10005

vector <int> G[MAX_N];
int N, M, E, cnt;

int dest[MAX_N], p[MAX_N], v[MAX_N];

	int pairup (int nod)
	{
		v[nod] = 1;
		int i;
		for (i = 0; i < G[nod].size(); ++i)
			if (!dest[G[nod][i]])
			{
				dest[G[nod][i]] = nod;
				p[nod] = G[nod][i];
				return 1;
			}
		for (i = 0; i < G[nod].size(); ++i)
			if (!v[ dest[G[nod][i]] ])
				if (pairup(dest[G[nod][i]]))
				{
					dest[G[nod][i]] = nod;
					p[nod] = G[nod][i];
					return 1;
				}
		return 0;
	}

	void solve ()
	{
		int ok = 1, i;
		while (ok)
		{
			ok = 0;
			memset (v, 0, sizeof (v));
			for (i = 1; i <= N; ++i)
				if (!p[i])
					if (pairup(i))
					{
						++cnt;
						ok = 1;
					}
		}
		printf ("%d\n", cnt);
		for (i = 1; i <= N; ++i)
			if (p[i]) printf ("%d %d\n", i, p[i]);
	}

	int main ()
	{
		freopen (FIN, "r", stdin);
		freopen (FOUT, "w", stdout);
		
		scanf ("%d %d %d", &N, &M, &E);
		while (E--)
		{
			int a, b;
			scanf ("%d %d", &a, &b);
			G[a].push_back(b);
		}
		solve();
		
		return 0;
	}