Cod sursa(job #862989)

Utilizator toranagahVlad Badelita toranagah Data 23 ianuarie 2013 09:41:38
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 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; 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, N2, M;

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

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

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

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

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


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