Cod sursa(job #253324)

Utilizator floringh06Florin Ghesu floringh06 Data 5 februarie 2009 17:51:55
Problema Cuplaj maxim in graf bipartit Scor 94
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>
#include <cstring>

using namespace std;

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

typedef struct NOD
{
    int nod;
    NOD *next;
};

NOD *A[MAX_N];
int dest[MAX_N];
int p[MAX_N];
int v[MAX_N];

int N, M, e;
int cnt;

	int pairup (int nod)
	{
		v[nod] = 1;
		for (NOD *q = A[nod]; q != NULL; q = q->next)
			if (!dest[q->nod])
			{
				dest[q->nod] = nod;
				p[nod] = 1;
				return 1;
			}
		for (NOD *q = A[nod]; q != NULL; q = q->next)
			if (!v[dest[q->nod]])
			    	if (pairup(dest[q->nod]))
				{
					dest[q->nod] = nod;
					p[nod] = 1;
					return 1;
				}
		return 0;
	}

	void cuplaj ()
	{
		int ok, i;
		ok = 1;
		while (ok)
		{
			ok = 0;
			memset (v, 0, sizeof (v));
			for (i = 1; i <= N; ++i)
			    if (!p[i])	
				if (pairup (i))
				{
					ok = 1;
					++cnt;
				}
		}

		printf ("%d\n", cnt);
		for (i = 1; i <= N; ++i)
			if (dest[i]) printf ("%d %d\n", dest[i], i);
	}

	int main ()
	{
		int i, a, b;

		freopen (FIN, "r", stdin);
		freopen (FOUT, "w", stdout);

		scanf ("%d %d %d", &N, &M, &e);
		for (i = 1; i <= e; ++i)
		{
			scanf ("%d %d", &a, &b);
			NOD *q = new (NOD);
			q->nod = b, q->next = A[a], A[a] = q; 
		}

		cuplaj ();
		return 0;
	}