Pagini recente » Cod sursa (job #1418019) | Istoria paginii runda/utcn-2024 | Cod sursa (job #1377289) | Cod sursa (job #1279190) | Cod sursa (job #3295952)
#include <fstream>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
// n = numărul de noduri din prima mulțime (stânga), m = din a doua (dreapta), e = nr muchii
int n, m, e, x, y, VV, sol, gasit;
int M1[10005], M2[10005], used[10005];
// Folosim matrice de adiacență pentru a reține muchiile (v[x][y] = 1 dacă există muchie între x și y)
bool adj[10005][10005];
// Funcția care încearcă să găsească un cuplaj pentru nodul k
int match(int k) {
if (used[k] == VV) return 0; // Dacă l-am vizitat deja în această rundă, ieșim
used[k] = VV;
// Parcurgem toate nodurile din a doua mulțime
for (int i = 1; i <= m; ++i) {
if (adj[k][i]) { // Dacă există muchie între k și i
if (!M2[i]) { // Dacă nodul i nu este deja cuplat
M1[k] = i;
M2[i] = k;
return 1;
}
}
}
// Încercăm să reconfigurăm cuplajul pentru a elibera nodul i
for (int i = 1; i <= m; ++i) {
if (adj[k][i] && match(M2[i])) {
M1[k] = i;
M2[i] = k;
return 1;
}
}
return 0; // Nu s-a putut cupla
}
int main() {
f >> n >> m >> e;
// Citim muchiile și completăm matricea de adiacență
for (int i = 1; i <= e; ++i) {
f >> x >> y;
adj[x][y] = true;
}
// Repetăm căutarea de cuplaje cât timp găsim cel puțin unul nou
gasit = 1;
while (gasit) {
gasit = 0;
++VV; // Folosit pentru marcarea nodurilor vizitate într-o rundă
for (int i = 1; i <= n; ++i) {
if (!M1[i]) // Dacă nodul i nu este cuplat
gasit += match(i); // Încercăm să-l cuplăm
}
}
// Calculăm câte cuplaje am realizat
for (int i = 1; i <= n; ++i)
if (M1[i])
++sol;
g << sol << "\n";
// Afișăm cuplajele
for (int i = 1; i <= n; ++i)
if (M1[i])
g << i << " " << M1[i] << "\n";
return 0;
}