Cod sursa(job #301907)

Utilizator scvalexAlexandru Scvortov scvalex Data 8 aprilie 2009 15:23:50
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
#include <iostream>
#include <vector>

using namespace std;

#define pb push_back
#define tr(C, i) for (typeof((C).begin()) i = (C).begin(); i != (C).end(); ++i)

typedef vector<int> VI;
typedef vector<VI> VVI;

int N, M;
VVI G;
VI U, l, r;

bool pairup(int u) {
	if (U[u])
		return false;
	U[u] = true;

	tr(G[u], vv)
		if (!r[*vv]) {
			l[u] = *vv;
			r[*vv] = u;
			return true;
		}

	tr(G[u], vv)
		if (pairup(r[*vv])) {
			l[u] = *vv;
			r[*vv] = u;
			return true;
		}

	return false;
}

int main(int argc, char *argv[]) {
	int E, u, v;

	ifstream fin("cuplaj.in");
	fin >> N >> M >> E;
	G.resize(N+1);
	while (E--) {
		fin >> u >> v;
		G[u].pb(v);
	}
	fin.close();

	U.resize(N+1);
	l.resize(N+1);
	r.resize(N+1);
	for (bool changed = true; changed; ) {
		changed = false;
		fill(U.begin(), U.end(), false);
		for (int i = 1; i <= N; ++i)
			if (!l[i])
				changed |= pairup(i);
	}

	int m = 0;
	for (int i = 1; i <= N; ++i)
		if (l[i])
			++m;

	ofstream fout("cuplaj.out");
	fout << m << endl;
	for (int i = 1; i <= N; ++i)
		if (l[i])
			fout << i << " " << l[i] << endl;
	fout.close();

	return 0;
}