Pagini recente » Cod sursa (job #2762984) | Cod sursa (job #3184703) | Cod sursa (job #1986227) | Cod sursa (job #2970635) | Cod sursa (job #2698446)
#include <fstream>
#include <cstring>
#include <unordered_map>
#include <queue>
#include <vector>
using namespace std;
ifstream cin ("cuplaj.in");
ofstream cout ("cuplaj.out");
unordered_map <int, int> c[20005];
int n, m, e, N, nr;
int ans[20005], anterior[20005];
vector <int> v[20005];
queue <int> q;
void bfs();
void reconstituire() {
int nod = N;
// cout << "idk";
while (nod != 0) {
--c[anterior[nod]][nod];
++c[nod][anterior[nod]];
if (!ans[anterior[nod]] && nod > n && nod < N)
++nr;
ans[anterior[nod]] = nod;
nod = anterior[nod];
}
}
void reinit() {
memset(anterior, 0, sizeof(anterior));
while (!q.empty())
q.pop();
}
void bfs() {
bool ok = true;
while (ok) {
reinit();
q.push(0);
ok = false;
while (!q.empty() && !ok) {
int nod = q.front();
q.pop();
for (auto it : v[nod]) {
if (!c[nod][it] || anterior[it]) {
continue;
}
anterior[it] = nod;
// cout << it << '\n';
if (it == N) {
reconstituire();
ok = true;
// break;
}
q.push(it);
}
}
}
}
int main() {
cin >> n >> m >> e;
N = n + m + 1;
for (int i = 1; i <= n; ++i) {
v[0].push_back(i);
c[0][i] = 1;
// v[i].push_back(0);
}
int x, y;
for (int i = 1; i <= e; ++i) {
cin >> x >> y;
v[x].push_back(y + n);
v[y + n].push_back(x);
c[x][y + n] = 1;
}
for (int i = 1; i <= m; ++i) {
v[i + n].push_back(N);
c[i + n][N] = 1;
// v[N].push_back(i + n);
}
bfs();
cout << nr << '\n';
for (int i = 1; i <= n; ++i) {
if (ans[i]) {
cout << i << ' ' << ans[i] - n << '\n';
}
}
return 0;
}