Cod sursa(job #580929)

Utilizator tvladTataranu Vlad tvlad Data 13 aprilie 2011 17:13:23
Problema Cuplaj maxim in graf bipartit Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <cstdio>
#include <vector>
#include <bitset>
using namespace std;

const int MAX_N = 10001;

int n, m, e;
vector<int> G[MAX_N];
bitset<MAX_N> used;
int r[MAX_N], l[MAX_N];

int pair_up ( int k ) {
	if (used[k])
		return 0;
	for (int i = 0; i < G[k].size(); ++i) {
		if (!l[G[k][i]]) {
			l[G[k][i]] = k;
			r[k] = G[k][i];
			return 1;
		}
	}
	for (int i = 0; i < G[k].size(); ++i) {
		if (l[G[k][i]] != k && pair_up(l[G[k][i]])) {
			l[G[k][i]] = k;
			r[k] = G[k][i];
			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);
	}

	int ans = 0;
	for (bool ok = true; ok; ) {
		ok = false;
		used = 0;
		for (int i = 1; i <= n; ++i) {
			if (!r[i] && pair_up(i)) {
				++ans;
				ok = true;
			}
		}
	}
	
	printf("%d\n",ans);
	for (int i = 1; i <= n; ++i)
		if (r[i])
			printf("%d %d\n",i,r[i]);
	return 0;
}