Cod sursa(job #3295952)

Utilizator ioana_moga600Ioana Moga ioana_moga600 Data 9 mai 2025 22:15:37
Problema Cuplaj maxim in graf bipartit Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#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;
}