Cod sursa(job #3357817)

Utilizator TestLicenta123Test Test TestLicenta123 Data 13 iunie 2026 15:14:37
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

const int DIM = 200001;
const int MOD = 1000000007;

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

vector<int> G[DIM];

bool found[DIM];
int v[DIM], x[DIM];

int n, m, Q, a, b, answer;

bool join(int node) {
    found[node] = true;
    for (auto k : G[node]) {
        if (!x[k]) {
            x[k] = node;
            v[node] = k;
            return true;
        }
    }
    for (auto k : G[node]) {
        if (!found[x[k]] && join(x[k])) {
            x[k] = node;
            v[node] = k;
            return true;
        }
    }
    return false;
}

int main() {
    fin >> n >> m >> Q;

    for (int i = 1; i <= Q; i++) {
        fin >> a >> b;
        G[a].push_back(b);
    }

    bool can_pair = true;
    while (can_pair) {
        can_pair = false;
        fill(found + 1, found + n + 1, false);
        for (int i = 1; i <= n; i++) {
            if (!v[i]) {
                can_pair |= join(i);
            }
        }
    }

    for (int i = 1; i <= n; i++) {
        if (v[i]) {
            answer++;
        }
    }

    fout << answer << "\n";
    for (int i = 1; i <= n; i++) {
        if (v[i]) {
            fout << i << " " << v[i] << "\n";
        }
    }

    return 0;
}