Pagini recente » Cod sursa (job #1628009) | Cod sursa (job #1469618) | Cod sursa (job #1990633) | Cod sursa (job #2949112) | Cod sursa (job #1792497)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");
const int N = (1e5) + 10;
vector<int> v[N];
vector<pair<int,int>> sol;
bool viz[N];
int L[N], R[N], n, m, nrc, x, y;
bool cuplaj (int nod) {
if (viz[nod]) {
return false;
}
viz[nod] = true;
for (auto &it : v[nod]) {
if (!R[it]) {
L[nod] = it;
R[it] = nod;
return true;
}
}
for (auto &it : v[nod]) {
if (cuplaj(R[it])) {
L[nod] = it;
R[it] = nod;
return true;
}
}
return false;
}
int main () {
cin >> n >> m;
for (int i = 1; i <= m; ++i) {
cin >> x >> y;
v[x].push_back(y);
}
bool ok = true;
int nrc = 0;
while (ok) {
ok = false;
memset(viz, 0, sizeof(viz));
for (int i = 1; i <= n; ++i) {
if (!L[i]) {
if (cuplaj(i)) {
ok = true;
++nrc;
}
}
}
}
for (int i = 1; i <= n; ++i) {
if (L[i]) {
sol.push_back({i, L[i]});
}
}
cout << sol.size() << "\n";
for (int i = 0; i < sol.size(); ++i) {
cout << sol[i].first << " " << sol[i].second << "\n";
}
return 0;
}