Cod sursa(job #412219)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 5 martie 2010 13:57:44
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
#include <vector>

using namespace std;

#define file_in "cuplaj.in"
#define file_out "cuplaj.out"

#define Nmax 10101

int n,m,e;
int viz[Nmax];
vector<int> G[Nmax];
int cuplaj1[Nmax];
int cuplaj2[Nmax];
int nr;

int cupleaza(int nod)
{
	if (viz[nod]) 
		return 0;
	
	viz[nod]=1;
	int x;
	for (int i=0;i<G[nod].size();++i)
		{
			x=G[nod][i];
			if (cuplaj1[x]==0)
			{
				cuplaj2[nod]=1;
				cuplaj1[x]=nod;
				return 1;
			}
		}
	
    for (int i=0;i<G[nod].size();++i)
		{
			x=G[nod][i];
			if (cuplaj1[x]!=nod && cupleaza(cuplaj1[x]))
			{
				cuplaj2[nod]=1;
				cuplaj1[x]=nod;
				return 1;
			}
		}		
		
	return 0;
}	

int main()
{
	int i,a,b;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d %d", &n, &m, &e);
	
	for (i=1;i<=e;++i)
	{
		scanf("%d %d", &a, &b);
		
		G[a].push_back(b);
		//G[b].push_back(a);
	}
	
	
	int ok=1;
	
	while(ok)
	{
		ok=0;
		
		memset(viz,0,sizeof(viz));
		
		for (i=1;i<=n;++i)
			 if (cuplaj2[i]==0 && cupleaza(i))
			 {
				 ok=1;
				 nr++;
			 }
	}
	
	
		
	printf("%d\n", nr);
	for (i=1;i<=m;++i)
		 if (cuplaj1[i])
			 printf("%d %d\n", cuplaj1[i],i);
		 
	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}