Cod sursa(job #302172)

Utilizator scvalexAlexandru Scvortov scvalex Data 8 aprilie 2009 18:28:10
Problema Felinare Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 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;
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 M, u, v;

	ifstream fin("felinare.in");
	fin >> N >> M;
	G.resize(N+1);
	while (M--) {
		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; ) {
		fill(U.begin(), U.end(), false);
		changed = false;
		for (int i = 1; i <= N; ++i)
			if (!L[i])
				changed |= pairup(i);
	}

	int cuplaj = 0;
	for (int i = 1; i <= N; ++i)
		if (L[i])
			++cuplaj;

	ofstream fout("felinare.out");
	fout << 2*N - cuplaj << endl;
	fout.close();

	return 0;
}