Cod sursa(job #444208)

Utilizator radu_voroneanuVoroneanu Radu Stefan radu_voroneanu Data 19 aprilie 2010 19:06:10
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <stdio.h>
#include <vector>
#define MAXN 10100

using namespace std;
vector<int> G[MAXN];
bool ok[MAXN], bif;
int St[MAXN], Dr[MAXN];
int i,n1,m,n2,x,y;

bool cupleaza(int nod)
{
	if (ok[nod])
		return false;
	ok[nod] = true;
	vector<int>::iterator it;
	for (it=G[nod].begin(); it!=G[nod].end(); it++)
		if (!St[*it] || cupleaza(St[*it])){
			St[*it] = nod;
			Dr[nod] = *it;
			return true;
		}
	return false;
}

int main()
{
	freopen("cuplaj.in","r",stdin);
	freopen("cuplaj.out","w",stdout);
	scanf("%d %d %d",&n1,&n2,&m);
	for (i=1; i<=m; i++){
		scanf("%d %d",&x,&y);
		G[x].push_back(y);
	}

	for (bif=true; bif; memset(ok,false,sizeof(ok)))
		for (i=1, bif=false; i<=n1; i++)
			if (!Dr[i])
				bif |= cupleaza(i);

	m = 0;
	for (i=1; i<=n1; i++)
		if (Dr[i])
			m++;
	printf("%d\n",m);
	for (i=1; i<=n1; i++)
		if (Dr[i])
			printf("%d %d\n",i, Dr[i]);
	return 0;
}