Pagini recente » Cod sursa (job #454755) | Cod sursa (job #2021019) | Cod sursa (job #1930969) | Cod sursa (job #835614) | Cod sursa (job #3298712)
#include <bits/stdc++.h>
#define int long long
#define ld long double
using namespace std;
// Inspired by: https://infoarena.ro/job_detail/3297319?action=view-source
int L, R, M;
int p[10'0010];
bool viz[10'0010];
vector<int> adj[10'0010];
bool pair_up(int node) {
if (viz[node]) return false;
viz[node] = true;
for (auto neigh : adj[node]) {
if (!p[neigh] || pair_up(p[neigh])) {
p[node] = neigh;
p[neigh] = node;
return true;
}
}
return false;
}
int32_t main() {
cin.tie(0)->sync_with_stdio(0);
#ifdef N257
freopen("input.txt", "r", stdin);
#else
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
#endif
// Setup the graph
cin >> L >> R >> M;
for (int i = 0; i < M; i++) {
int leftNode, rightNode; cin >> leftNode >> rightNode;
rightNode += L;
adj[leftNode].emplace_back(rightNode);
adj[rightNode].emplace_back(leftNode);
}
bool dai = true;
int cnt = 0;
while ( dai ) {
dai = false;
memset(viz, 0, sizeof(viz));
for (int i = 1; i <= L; i++) {
if (!p[i] && pair_up(i)) {
dai = true;
cnt++;
}
}
}
cout << cnt << '\n';
for (int i = 1; i <= L; i++) {
if (p[i])
cout << i << ' ' << p[i] - L << '\n';
}
}