Pagini recente » Cod sursa (job #1428992) | Cod sursa (job #6831) | Cod sursa (job #419957) | Cod sursa (job #1151826) | Cod sursa (job #1442584)
#include <iostream>
#include <vector>
#include <bitset>
#define MAXN 10005
using namespace std;
int N, M, E;
vector <int> G[MAXN];
int st[MAXN], dr[MAXN];
bitset <MAXN> marcat;
int cupleaza(int nod) {
if (marcat[nod]) {
return 0;
}
marcat[nod] = 1;
for (int vecin : G[nod]) {
if (!dr[vecin]) { // daca vecinul din dreapta n-are pereche
st[nod] = vecin;
dr[vecin] = nod;
return 1;
}
}
// daca n-am cu cine sa imperechem nodul (toti vecinii din partea
// dreapta sunt deja imperecheati)
for (int vecin : G[nod]) {
if (cupleaza(dr[vecin])) {
st[nod] = vecin;
dr[vecin] = nod;
return 1;
}
}
return 0;
}
int main()
{
iostream::sync_with_stdio(false);
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
cin >> N >> M >> E;
for (int i = 1; i <= E; ++i) {
int x, y;
cin >> x >> y;
G[x].push_back(y);
}
int cuplaj = 0;
for (int i = 1; i <= N; ++i) {
if (!cupleaza(i)) {
marcat.reset();
cuplaj += cupleaza(i);
} else {
cuplaj++;
}
}
cout << cuplaj << "\n";
for (int i = 1; i <= N; ++i) {
if (st[i] != 0) {
cout << i << " " << st[i] << "\n";
}
}
return 0;
}