Cod sursa(job #3347558)

Utilizator bogdan1479Luca Bogdan Alexandru bogdan1479 Data 17 martie 2026 11:16:36
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <vector>

using namespace std;

const int NMAX = 1e4 + 1;

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

int N, M, E, solCuplaj;

int L[NMAX], R[NMAX];
bool viz[NMAX];

vector<int> G[NMAX];

void citire() {
    int x, y;
    fin >> N >> M >> E;

    while(E--) {
        fin >> x >> y;
        G[x].push_back(y);
    }
}

bool DFS(int x) {
    if(viz[x]) return 0;
    viz[x] = 1;

    for(auto &y : G[x])
        if(!R[y] || DFS(R[y])) {
            L[x] = y;
            R[y] = x;

            return 1;
        }

    return 0;
}

void HK() { ///Hopcroft-Karp
    bool amSchimbat = 1;
    int i;

    while(amSchimbat) {
        amSchimbat = 0;

        for(i = 1; i <= N; ++i)
            viz[i] = 0;

        for(i = 1; i <= N; ++i) {
            if(!L[i] && DFS(i)) {
                amSchimbat = 1;
                ++solCuplaj;
            }
        }
    }
}

int main() {
    citire();
    HK();

    fout << solCuplaj << '\n';
    for(int i = 1; i <= N; ++i) {
        if(L[i]) {
            fout << i << ' ' << L[i] << '\n';
        }
    }

    return 0;
}