Cod sursa(job #863008)

Utilizator toranagahVlad Badelita toranagah Data 23 ianuarie 2013 10:12:20
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <algorithm>
#include <cstring>
#include <fstream>
#include <iostream>
#include <utility>
#include <vector>
#include <queue>
using namespace std;

#define FORIT(it, v) for (typeof((v).begin()) it = (v).begin(); it != (v).end(); ++it)

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

const int MAX_N = 10100;

vector<int> graph[MAX_N];
bool visited[MAX_N];
int cuplaj[MAX_N];
int pereche[MAX_N];
int result = 0;
int N, M, E;

void read(), solve(), print();
bool try_cuplaj(int node);

int main() {
	read();
	solve();
	print();
	return 0;
}

void read() {
	fin >> N >> M >> E;
	for (int i = 1; i <= E; ++i) {
		int node1, node2;
		fin >> node1 >> node2;
		graph[node1].push_back(node2);
	}
}

void solve() {
	for (int i = 1; i <= N; ++i) {
		if (!cuplaj[i]) {
			fill(visited, visited + N + 1, 0);
			result += try_cuplaj(i);
		}
	}
}

bool try_cuplaj(int node) {
	if (visited[node]) return false;
	visited[node] = true;
	FORIT (it, graph[node]) {
		if (!pereche[*it] || try_cuplaj(pereche[*it])) {
			cuplaj[node] = *it;
			pereche[*it] = node; 
			return true;
		}
	}
	return false;
}


void print() {
	fout << result << '\n';
	for (int i = 1; i <= N; ++i) {
		if (cuplaj[i] != 0) {
			fout << i << ' ' << cuplaj[i] << '\n';
		}
	}
}