Pagini recente » Cod sursa (job #1958795) | Cod sursa (job #1527242) | Cod sursa (job #807433) | Cod sursa (job #20373) | Cod sursa (job #2430491)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <utility>
#include <cassert>
#include <cstring>
#include <cstdio>
using namespace std;
int m_used[10005];
int m_left[10005];
int m_right[10005];
vector<int> m_edges[10006];
int N, M, E;
bool go(int node) {
m_used[node] = 1;
for (auto next : m_edges[node])
if (!m_right[next] || (!m_used[m_right[next]] && go(m_right[next]))) {
m_left[node] = next;
m_right[next] = node;
return true;
}
return false;
}
int main() {
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
ios::sync_with_stdio(false);
//ifstream cin("cuplaj.in");
//ofstream cout("cuplaj.out");
cin >> N >> M >> E;
for (int i = 1; i <= E; ++i) {
int x, y; cin >> x >> y;
m_edges[x].emplace_back(y);
}
int ok = 1, answer = 0;
while (ok) {
memset(m_used, 0, sizeof(m_used));
ok = 0;
for (int i = 1; i <= N; ++i)
if (!m_used[i] && !m_left[i]) {
ok += go(i);
}
answer += ok;
}
cout << answer << "\n";
for (int i = 1; i <= N; ++i)
if (m_left[i])
cout << i << " " << m_left[i] << "\n";
}