Cod sursa(job #339409)

Utilizator razvi9Jurca Razvan razvi9 Data 9 august 2009 18:03:11
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include<cstdio>
#include<vector>

int dr[10001],viz[10001],st[10001];
::std::vector<int> a[10001];
int n,m,k,i,nr;

int cupleaza(int x)
{
	int i;
	if(viz[x]) return 0;
	viz[x] = 1;
	for(i=0;i<a[x].size();++i)
		if(!st[a[x][i]])
		{
			st[a[x][i]] = x;
			dr[x] = a[x][i];
			return 1;
		}
	for(i=0;i<a[x].size();++i)
		if(cupleaza(st[a[x][i]]))
		{
			st[a[x][i]] = x;
			dr[x] = a[x][i];
			return 1;
		}
	return 0;
}

int main()
{
	freopen("cuplaj.in","r",stdin);
	freopen("cuplaj.out","w",stdout);
	scanf("%d %d %d",&n,&m,&k);
	for(int x,y;k;--k)
	{
		scanf("%d %d",&x,&y);
		a[x].push_back(y);
	}

	for(int ok = 1; ok; )
	{
		ok = 0;
		memset(viz,0,sizeof(viz));
		for(i=1;i<=n;++i)
			if(!dr[i])
				ok |= cupleaza(i);
	}

	for(i=1;i<=n;++i)
		if(dr[i]) 
			++nr;
	printf("%d\n",nr);
	for(i=1;i<=n;++i)
		if(dr[i])
		{
			printf("%d %d\n",i,dr[i]);
		}
	fclose(stdout);
	return 0;
}