Cod sursa(job #398718)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 19 februarie 2010 11:13:56
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include<stdio.h>
#include<vector>
#define Nmax 10010
using namespace std;

int n,m,E,dr[Nmax],st[Nmax],viz[Nmax],i,j,sol,x,y;
vector <int> G[Nmax];

int cupleaza(int nod)
{
	int i,N=G[nod].size(),fiu;
	if(viz[nod]) return 0;
	viz[nod]=1;

	for(i=0;i<N;i++)
	{
		fiu=G[nod][i];
		if( !dr[fiu] || cupleaza(dr[fiu]) )
		{
			st[nod]=fiu;
			dr[fiu]=nod;
			return 1;
		}
	}
	return 0;
}

int main()
{
	freopen("cuplaj.in","r",stdin);
	freopen("cuplaj.out","w",stdout);
	
	scanf("%d %d %d",&n,&m,&E);
	
	for(i=1;i<=E;i++)
	{
		scanf("%d %d",&x,&y);
		
		G[x].push_back(y);
	}
	
	for(i=1;i<=n;i++)
	{
		if(!st[i])
		{
			if( cupleaza(i) ) sol++;
		}
		else
		{
			for(j=1;j<=n;j++)
				viz[i]=0;
			if(cupleaza(i)) sol++;
		}
	}
	
	printf("%d\n",sol);
	
	for(i=1;i<=n;i++)
		if(st[i]) printf("%d %d\n",i,st[i]);
	
	return 0;
}