Cod sursa(job #353799)

Utilizator prdianaProdan Diana prdiana Data 6 octombrie 2009 10:59:58
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <stdio.h>
#include <vector>
#include <string.h>
#define MAXN 10002

using namespace std;

int stanga[MAXN],dreapta[MAXN];
bool viz[MAXN],ok = true;
int j,x,y,s,d,m,c;
vector<int> a[MAXN];

bool pairUp(int node)
{
	int i;
	if (viz[node])
	{
		return false;
	}
	viz[node] = true;

	for (i=0;i<a[node].size();i++)
	{
		c++;
		if (!dreapta[a[node][i]])
		{
			dreapta[a[node][i]] = node;
			stanga[node] = a[node][i];
			return true;
		}
	}

	for (i=0;i<a[node].size();i++)
	{
		if (pairUp(dreapta[a[node][i]]))
		{
			dreapta[a[node][i]] = node;
			stanga[node] = a[node][i];
			return true;
		}
	}
	return false;

}

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

	int i;

	scanf("%d%d%d",&s,&d,&m);
	for (i=0;i<m;i++)
	{
		scanf("%d%d",&x,&y);
		a[x].push_back(y);
	}

	while (ok)
	{
		ok = false;
		memset(viz,0,sizeof(viz));
		for (i=1;i<=s;i++)
		{
			if (!stanga[i])
			{
				ok |= pairUp(i);
			}
		}
	}
	int cuplaj = 0;
	for (i=1;i<=s;i++)
	{
		if (stanga[i])
		{
			cuplaj++;
		}
	}

	printf("%d\n",cuplaj);

	for (i=1;i<=s;i++)
	{
		if (stanga[i])
		{
			printf("%d %d\n",i,stanga[i]);
		}
	}

	return 0;
}