Cod sursa(job #226595)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 2 decembrie 2008 01:29:47
Problema Cuplaj maxim in graf bipartit Scor Ascuns
Compilator cpp Status done
Runda Marime 1.44 kb
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <vector>

using namespace std;

#define maxn 10010

int n, m, e, l, sol;
int g[maxn], gt[maxn];
vector <int> a[maxn], b[maxn];
int s[maxn], u[maxn], mark[maxn];

void cuplaj()
{
	int i, j, x;

	for (i=1; i<=n; i++)
	{
		l = 0;

		for (j=0; j<g[i]; j++)
			if (!u[a[i][j]]) s[l++] = a[i][j];

		if (l)
		{
			sol++;
			x = rand() % l;

			u[s[x]] = 1;
			mark[i] = s[x];
		}
	}
}

int main()
{
	freopen("cuplaj.in", "r", stdin);
	freopen("cuplaj.out", "w", stdout);

	srand(time(0));

	int i, j, x, y, time1;

	time1 = time(0);

	scanf("%d %d %d ", &n, &m, &e);

	for (i=1; i<=e; i++)
	{
		scanf("%d %d ", &x, &y);
		a[x].push_back(y);
		b[y].push_back(x);
	}

	for (i=1; i<=n; i++) g[i] = a[i].size();
	for (i=1; i<=m; i++) gt[i] = b[i].size();

	cuplaj();


	do 
	{
		x = rand() % n + 1;
		
		if (mark[x])
			for (i=0, j = rand()%gt[mark[x]]; i<gt[mark[x]]; i++)
			{
				j++;
				if (j == gt[mark[x]]) j = 0;
			
				if (!mark[b[mark[x]][j]]) 
				{
					mark[b[mark[x]][j]] = mark[x];
					mark[x] = 0;
					break;
				}
			}

		if (!mark[x])
			for (i=0, j = rand()%g[x]; i<g[x]; i++)
			{
				j++;
				if (j == g[x]) j = 0;

				if (!u[a[x][i]]) 
				{
					sol++;
					mark[x] = a[x][i];
					u[a[x][i]] = 1;
					break;
				}
			}
	}
	while (1.0 * (time(0)-time1) / CLOCKS_PER_SEC < 0.0000002);

	printf("%d\n", sol);
	for (i=1; i<=n; i++) 
		if (mark[i]) printf("%d %d\n", i, mark[i]);

	return 0;
}