Cod sursa(job #3350488)

Utilizator Radu_BicliBiclineru Radu Radu_Bicli Data 8 aprilie 2026 18:53:24
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>

using namespace std;

#define ST_DIO 0
#if ST_DIO
    #define fin cin
    #define fout cout
#else
    ifstream fin("cuplaj.in");
    ofstream fout("cuplaj.out");
#endif  // ST_DIO

int n, m, e, rasp, i, st[2 * 10002], dr[2 * 10002];
vector<int> gr[2 * 10002];
bool viz[2 * 10002], ok;

static inline bool Bipartit(int nod) {
    viz[nod] = true;
    for(int vec : gr[nod]) {
        if(-1 == dr[vec]) {
            st[nod] = vec;
            dr[vec] = nod;
            return true;
        }
    }

    for(int vec : gr[nod]) {
        if(!viz[dr[vec]] && Bipartit(dr[vec])) {
            st[nod] = vec;
            dr[vec] = nod;
            return true;
        }
    }
    return false;
}

int main() {
    if(ST_DIO) ios_base::sync_with_stdio(false);
    fin.tie(nullptr);
    fout.tie(nullptr);

    fin >> n >> m >> e;
    for(i = 1; i <= e; i++) {
        int x, y;
        fin >> x >> y;
        gr[x].push_back(n + y);
    }

    for(i = 1; i <= n + m; i++) st[i] = dr[i] = -1;

    do {
        ok = false;
        for(i = 1; i <= n; i++) viz[i] = false;
        for(i = 1; i <= n; i++) {
            if(-1 == st[i]) ok |= Bipartit(i);
        }
    }
    while(ok);

    for(i = 1; i <= n; i++) rasp += (-1 != st[i]);
    fout << rasp << '\n';
    for(i = 1; i <= n; i++) {
        if(-1 != st[i]) fout << i << ' ' << st[i] - n << '\n';
    }

    return 0;
}