Cod sursa(job #301328)

Utilizator tvladTataranu Vlad tvlad Data 8 aprilie 2009 09:41:50
Problema Cuplaj maxim in graf bipartit Scor 16
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;

const int N_MAX = 10001;

int n,m,e, rez;
bool view[N_MAX];
int cuplaj[N_MAX];
vector<int> G[N_MAX];

int pair_up ( int nod ) {
	if (view[nod])
		return 0;
	for (vector<int>::iterator it = G[nod].begin(); it != G[nod].end(); ++it) {
		if (!cuplaj[*it]) {
			cuplaj[*it] = nod;
			return 1;
		}
	}
	for (vector<int>::iterator it = G[nod].begin(); it != G[nod].end(); ++it) {
		if (cuplaj[*it] != nod && pair_up(cuplaj[*it])) {
			cuplaj[*it] = nod;
			return 1;
		}
	}
	return 0;
}

int main() {
	freopen("cuplaj.in","rt",stdin);
	freopen("cuplaj.out","wt",stdout);
	scanf("%d %d %d",&n,&m,&e);
	for (int i = 0, a,b; i < e; ++i) {
		scanf("%d %d",&a,&b);
		G[a].push_back(b);
	}
	for (int i = 1; i <= n; ++i) {
		memset(view,sizeof(bool)*N_MAX,0);
		rez += pair_up(i);
	}
	printf("%d\n",rez);
	for (int i = 1; i <= m; ++i)
		if (!cuplaj[i])
			printf("%d %d\n",cuplaj[i],i);
	return 0;
}