Cod sursa(job #1926843)

Utilizator heracleRadu Muntean heracle Data 14 martie 2017 18:41:11
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <cstdio>
#include <cstring>

const int Q=10007, W=100007;

int lst[Q],nxt[W],val[W];
int cnt;

void add(int a, int b)
{
	val[++cnt]=b;
	nxt[cnt]=lst[a];
	lst[a]=cnt;
}

int n,z,m;

int st[Q],dr[Q];

bool viz[Q];

bool cuplare(int nod)
{
	if(viz[nod]==1)
		return 0;
	viz[nod]=1;

	for(int p=lst[nod]; p; p=nxt[p])
	{
		if(dr[val[p]]==0)
		{
			st[nod]=val[p];
			dr[val[p]]=nod;
			return 1;
		}
	}
	for(int p=lst[nod]; p; p=nxt[p])
	{
		if(cuplare(dr[val[p]]))
		{
			st[nod]=val[p];
			dr[val[p]]=nod;
			return 1;
		}
	}
	return 0;

}

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

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


	int a,b;
	for(int i=1; i<=m; i++)
	{
		scanf("%d%d",&a,&b);
		add(a,b);
	}

	bool t=1;

	int rez=0;

	while(t)
	{
		t=0;

		memset(viz, 0, sizeof viz);

		for(int i=1; i<=n; i++)
		{
			if(st[i]==0 && cuplare(i))
			{
				rez++;
				t=1;
			}
		}
	}

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

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



	return 0;
}