Pagini recente » Cod sursa (job #1735842) | Cod sursa (job #1471573) | Cod sursa (job #2422097) | Cod sursa (job #2896997) | Cod sursa (job #1803525)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream cin ("cuplaj.in");
ofstream cout ("cuplaj.out");
const int MaxN = 10005;
vector <int> G[MaxN];
int n, m, e;
bool Done;
int LfCouple[MaxN], RgCouple[MaxN];
bool used[MaxN];
bool Cuplaj(int node) {
if (used[node]) {
return false;
}
used[node] = true;
for (auto nxt: G[node]) {
if (!RgCouple[nxt]) {
RgCouple[nxt] = node;
LfCouple[node] = nxt;
return true;
}
}
for (auto nxt: G[node]) {
if (Cuplaj(RgCouple[nxt])) {
RgCouple[nxt] = node;
LfCouple[node] = nxt;
return true;
}
}
return false;
}
int main() {
cin >> n >> m >> e;
for (int i = 1; i <= e; ++i) {
int a, b;
cin >> a >> b;
G[a].push_back(b);
//G[b].push_back(a);
}
Done = false;
while (!Done) {
memset(used, false, sizeof used);
Done = true;
for (int i = 1; i <= n; ++i) {
if (LfCouple[i]) {
continue;
}
if (Cuplaj(i)) {
Done = false;
}
}
}
int Ans = 0;
for (int i = 1; i <= n; ++i) {
if (LfCouple[i]) {
++Ans;
}
}
cout << Ans << '\n';
for (int i = 1; i <= n; ++i) {
if (LfCouple[i]) {
cout << i << ' ' << LfCouple[i] << '\n';
}
}
return 0;
}