Cod sursa(job #563414)

Utilizator CipaFlorescu Ciprian Cipa Data 25 martie 2011 02:57:31
Problema Cuplaj maxim in graf bipartit Scor 24
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<cstdio>
#include<cstdlib>
#include<vector>
using namespace std;

#define MAX 2000000000

vector<vector<int> > G;
int n,m,e;
vector<int> l,d,q,r,u;

bool BFS()
{
	q.clear();
	for(int i=1;i<=n;i++)
		if(l[i] == 0)
		{
			d[i] = 0;
			q.push_back(i);
		}
		else
			d[i] = MAX;
	
	d[0] = MAX;
	
	while (q.size())
	{
		int v = q.front();
		q.erase(q.begin());
		if(v)
			for(int i=0;i<G[v].size();i++)
				if(d[r[G[v][i]]] == MAX)
				{
					d[r[G[v][i]]] = d[v] + 1;
					q.push_back(r[G[v][i]]);
				}
	}
	
	return d[0] != MAX;
	
}


bool DFS(int v)
{
	if(v && !u[v])
	{
		u[v] = 1;
		for(int i=0;i<G[v].size();i++)
			if(d[r[G[v][i]]] == d[v] + 1)
				if(!r[i] || DFS(r[G[v][i]]))
				{
					r[G[v][i]] = v;
					l[v] = G[v][i];
					return true;
				}
		d[v] = MAX;
		return false;
	}
	return true;
}		

int HK()
{
	int match = 0;
	do
	{
		u.clear();
		u.resize(n+5,0);
		for(int i = 1;i<=n;i++)
			if(l[i] == 0)
				if(DFS(i) == true)
					match ++;
	}while(BFS());
	return match;
}

int main()
{
	freopen("cuplaj.in","r",stdin);
	freopen("cuplaj.out","w",stdout);
	scanf("%d %d %d",&n,&m,&e);
	G.resize(n+5);
	l.resize(n+5,0);
	d.resize(n+5,0);
	r.resize(m+5,0);
	int f,t;
	for(int i=0;i<e;++i)
	{
		scanf("%d %d",&f,&t);
		G[f].push_back(t);
	}
	
	int k = HK();
	printf("%d\n",k);
	
	for(int i=1;i<=n;i++)
		if(l[i])
			printf("%d %d\n",i,l[i]);
}