Cod sursa(job #1467971)

Utilizator mouse_wirelessMouse Wireless mouse_wireless Data 5 august 2015 01:06:02
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <cstdio>
#include <cstdlib>
#include <cassert>
#include <vector>
#include <list>
#include <queue>
#include <cstring>
#include <set>
using namespace std;

#ifdef INFOARENA
#define ProblemName "cuplaj"
#endif

#define MCONCAT(A, B) A B
#ifdef ProblemName
#define InFile MCONCAT(ProblemName, ".in")
#define OuFile MCONCAT(ProblemName, ".out")
#else
#define InFile "fis.in"
#define OuFile "fis.out"
#endif

#define NMAX 10010

vector< list<int> > G(NMAX);
vector<int> leftPair(NMAX, -1);
vector<int> rightPair(NMAX, -1);
vector<char> visited(NMAX);

bool pairUp(int nod) {
	if (visited[nod])
		return false;
	visited[nod] = 1;
	for (auto i : G[nod])
	if (rightPair[i] == -1) {
		rightPair[i] = nod;
		leftPair[nod] = i;
		return true;
	}
	for (auto i : G[nod])
	if (pairUp(rightPair[i])) {
		rightPair[i] = nod;
		leftPair[nod] = i;
		return true;
	}
	return false;
}

int main() {
	assert(freopen(InFile, "r", stdin));
	assert(freopen(OuFile, "w", stdout));
	int N, M, E;
	scanf("%d%d%d", &N, &M, &E);
	for (int i = 0; i < E; i++) {
		int n1, n2;
		scanf("%d%d", &n1, &n2);
		G[n1 - 1].push_back(n2 - 1);
	}
	bool found = true;
	visited.resize(N);
	while (found) {
		found = false;
		memset(&visited[0], 0, sizeof(visited[0]) * visited.size());
		for (int i = 0; i < N; i++)
		if (leftPair[i] == -1)
			found = found || pairUp(i);
	}
	int flow = 0;
	for (int i = 0; i < N; i++)
	if (leftPair[i] != -1)
		flow++;
	printf("%d\n", flow);
	for (int i = 0; i < N; i++)
	if (leftPair[i] != -1)
		printf("%d %d\n", i + 1, leftPair[i] + 1);
	return 0;
}