Pagini recente » Cod sursa (job #2856232) | Borderou de evaluare (job #1588996) | Cod sursa (job #1979321) | Cod sursa (job #2935892) | Cod sursa (job #3336724)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
// n = noduri stânga, m = noduri dreapta, e = muchii
int n, m, e, cuplaj;
int viz[10005], l[10005], r[10005];
vector<int> muchii[10005];
// Funcția caută un "lanț de ameliorare"
bool pairup(int x) {
if (viz[x]) return false;
viz[x] = 1;
// Pasul 1: Încercăm să cuplăm nodul x cu un vecin liber din dreapta
for (auto it : muchii[x]) {
if (r[it] == 0) {
r[it] = x;
l[x] = it;
return true;
}
}
// Pasul 2: Dacă nu am găsit un vecin liber, încercăm să "rearanjăm"
// cuplajele existente (recursivitate)
for (auto it : muchii[x]) {
if (pairup(r[it])) {
r[it] = x;
l[x] = it;
return true;
}
}
return false;
}
int main() {
// Optimizare citire
fin.tie(NULL);
if (!(fin >> n >> m >> e)) return 0;
for (int i = 1; i <= e; ++i) {
int x, y;
fin >> x >> y;
muchii[x].push_back(y);
}
bool ok = true;
while (ok) {
ok = false;
// Resetăm vizitarea pentru fiecare iterație de căutare
for (int i = 1; i <= n; ++i) viz[i] = 0;
// Încercăm să cuplăm fiecare nod din stânga care nu are încă un partener
for (int i = 1; i <= n; ++i) {
if (l[i] == 0) {
if (pairup(i)) ok = true;
}
}
}
// Numărăm câte noduri din stânga au partener (l[i] != 0)
for (int i = 1; i <= n; ++i) {
if (l[i] != 0) cuplaj++;
}
fout << cuplaj << '\n';
for (int i = 1; i <= n; ++i) {
if (l[i] != 0) {
fout << i << ' ' << l[i] << '\n';
}
}
return 0;
}