Cod sursa(job #2470967)

Utilizator Alex18maiAlex Enache Alex18mai Data 9 octombrie 2019 22:26:02
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
//ALEX ENACHE

#include <vector>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <unordered_map>
#include <time.h>
#include <iomanip>
#include <deque>
#include <math.h>
#include <assert.h>
#include <stack>
#include <bitset>
#include <random>

using namespace std;

//-----------------------------------------------------------------

//#include <iostream>
#include <fstream>

//ifstream cin("input"); ofstream cout("output");
ifstream cin("cuplaj.in"); ofstream cout("cuplaj.out");

const int inf = 1e9;
const int MAXN = 10100;

vector < int > gr[MAXN];

int used[MAXN];
int ans[MAXN];
int cup[MAXN];

int cuplaj(int nod) {
	used[nod] = 1;
	for (auto& x : gr[nod]) {
		if (!cup[x] || (!used[cup[x]] && cuplaj(cup[x]))) {
			cup[x] = nod;
			ans[nod] = x;
			return 1;
		}
	}
	return 0;
}

int main() {

	int n, m, e;
	cin >> n >> m >> e;

	for (int i = 1; i <= e; i++) {
		int a, b;
		cin >> a >> b;
		gr[a].push_back(b);
	}

	int c = 1;
	while (c) {
		c = 0;
		for (int i = 1; i <= n; i++) {
			used[i] = 0;
		}
		for (int i = 1; i <= n; i++) {
			if (!ans[i] && !used[i]) {
				c |= cuplaj(i);
			}
		}
	}

	int cont = 0;

	for (int i = 1; i <= n; i++) {
		if (ans[i]) {
			cont++;
		}
	}

	cout << cont << '\n';
	for (int i = 1; i <= n; i++) {
		if (ans[i]) {
			cout << i << " " << ans[i] << '\n';
		}
	}

	return 0;
}