Pagini recente » Cod sursa (job #407774) | Cod sursa (job #47040) | Cod sursa (job #3244056) | Cod sursa (job #2044465) | Cod sursa (job #3268943)
#include <bits/stdc++.h>
#define int long long
#define pii pair<int, int>
#define fs first
#define sd second
using namespace std;
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
int n1, n2, n, m;
int mt[20005], l[20005];
bitset<20005> used;
vector<int> g[20005];
int change;
vector<pii> ans;
bool try_kuhn(int node) {
if(used[node])
return false;
used[node] = true;
for(auto nxt : g[node]) {
if(mt[nxt] == -1 || try_kuhn(mt[nxt])) {
l[node] = nxt;
mt[nxt] = node;
return true;
}
}
return false;
}
signed main() {
in >> n1 >> n2 >> m;
n = n1 + n2;
for(int i = 1; i <= m; i++) {
int u, v; in >> u >> v;
g[u].push_back(v);
}
for(int i = 1; i <= n2; i++) {
mt[i] = -1;
}
for(int i = 1; i <= n1; i++) {
l[i] = -1;
}
change = 1;
while(change) {
change = 0;
used = 0;
for(int i = 1; i <= n1; i++) {
if(l[i] == -1) {
change |= try_kuhn(i);
}
}
}
for(int i = 1; i <= n2; i++) {
if(mt[i] != -1) {
ans.push_back({mt[i], i});
}
}
sort(ans.begin(), ans.end());
out << ans.size() << '\n';
for(auto elem : ans) {
out << elem.fs << ' ' << elem.sd << '\n';
}
return 0;
}