Cod sursa(job #356788)

Utilizator TYTUSVlad Saveluc TYTUS Data 16 octombrie 2009 12:14:15
Problema Cuplaj maxim in graf bipartit Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <vector>
#include <cstring>
#include <iostream>
using namespace std;

const int NMAX = 10101;

vector<int>lv[NMAX];

int l[NMAX], r[NMAX];
bool viz[NMAX];

bool cupleaza(int nod) {
	if (viz[nod])
		return false;
	viz[nod] = true;
	for (vector<int>::iterator it = lv[nod].begin(); it != lv[nod].end(); ++it)
		if (!r[*it]) {
			l[nod] = *it;
			r[*it] = nod;
			return true;
		}
	for (vector<int>::iterator it = lv[nod].begin(); it != lv[nod].end(); ++it) 
		if (r[*it] && cupleaza(r[*it])) {
			l[nod] = *it;
			r[*it] = nod;
			return true;
		}
	return false;
}

int main() {
	freopen("cuplaj.in", "r", stdin);
	freopen("cuplaj.out", "w", stdout);
	int n, m, k;
	cin>>n>>k>>m;
	while (m--) {
		int a, b;
		cin>>a>>b;
		lv[a].push_back(b);
	}
	int ret = 0;
	bool ok = true;
	while (ok) {
		ok = false;
		memset(viz, false, sizeof(viz));
		for (int i = 1; i <= n; ++i)
			if (!l[i] && cupleaza(i)) {
				ok = true;
				ret++;
			}
	}
	cout<<ret<<endl;
	for (int i = 1; i <= n; ++i)
		if (l[i])
			cout<<i<<" "<<l[i]<<endl;
	return false;
}