Cod sursa(job #2860495)

Utilizator radu.Radu Cristi radu. Data 2 martie 2022 18:15:53
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <vector>
#include <cstring>
#define NMAX 10005
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
vector<vector<int>> gr;
int N, M, E;
int l[NMAX], r[NMAX];
bool d[NMAX];
void read() {
    fin >> N >> M >> E;
    gr.resize(N + 1);
    int x, y;
    for (int i = 1; i <= E; ++i) {
        fin >> x >> y;
        gr[x].push_back(y);
    }
}
void setCuplaj(int a, int b) {
    l[a] = b;
    r[b] = a;
}
bool cupleaza(int nod) {
    if (d[nod] == true) {
        return false;
    }
    d[nod] = true;
    for (int i : gr[nod]) {
        if (!r[i]) {
            setCuplaj(nod, i);
            return true;
        }
    }
    for (int i : gr[nod]) {
        if (cupleaza(r[i])) {
            setCuplaj(nod, i);
            return true;
        }
    }
    return false;
}
void afis() {
    int con = 0;
    for (int i = 1; i <= N; ++i) {
        if (l[i]) {
            ++con;
        }
    }
    fout << con << "\n";
    for (int i = 1; i <= N; ++i) {
        if (l[i]) {
            fout << i << " " << l[i] << "\n";
        }
    }
}
int main()
{
    read();
    bool ok = true;
    while (ok) {
        ok = false;
        memset(d, 0, sizeof d);
        for (int i = 1; i <= N; ++i) {
            if (!l[i]) {
                if (cupleaza(i)) {
                    ok = true;
                }
            }
        }
    }
    afis();
    return 0;
}