Cod sursa(job #389412)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 1 februarie 2010 17:17:00
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <cstdio>
#include <vector>

using namespace std;

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

#define Nmax 100101

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;
	if (viz[nod]==1)
		return 0;
	viz[nod]=1;
	
	for (i=0;i<G[nod].size();++i)
	{
		x=G[nod][i];
		
		if (cuplaj1[x]==0)
		{
			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);
	}
	
		
	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++;
			}
		}
	}
	
	/*for (i=1;i<=m;++i)
	     if (cuplaj1[i]) nr++;*/
	printf("%d\n", nr);
	
	for (i=1;i<=m;++i)
	      if (cuplaj1[i]!=0)
			  printf("%d %d\n", cuplaj1[i],i);
		  
	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}