Cod sursa(job #389408)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 1 februarie 2010 17:06:18
Problema Cuplaj maxim in graf bipartit Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 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,viz[Nmax];
vector<int> G[Nmax];
int cuplaj1[Nmax];
int cuplaj2[Nmax];
int nr;

inline int cupleaza(int nod)
{
	int i,x;
	viz[nod]=1;
	
	for (i=0;i<G[nod].size();++i)
	{
		x=G[nod][i];
		
		if (!cuplaj1[x])
		{
			cuplaj2[nod]=1;
		    cuplaj1[x]=nod;
		    return 1;
		}
	}
	
	for (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,ok,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);
	}
	
	memset(viz,0,sizeof(viz));
	
	ok=0;
	nr=0;
	while(!ok)
	{
		ok=1;
		
		memset(viz,0,sizeof(viz));
		for (i=1;i<=n;++i)
			 if (cupleaza(i) && !cuplaj2[i])
			      ok=1;
	}
	
	for (i=1;i<=m;++i)
	     if (cuplaj1[i]) 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;
	
}