Cod sursa(job #3041052)

Utilizator NuSuntRomanIspir Alexandru NuSuntRoman Data 30 martie 2023 21:29:00
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <bits/stdc++.h>

const int NMAX = 2e4 + 5;

int n, m, K, f[NMAX], cp[NMAX];
std :: vector < int > G[NMAX];

bool match(int node) {
    if (f[node] == true)
        return false;

    f[node] = true;

    for (int i = 0; i < G[node].size(); ++ i) {
        int u = G[node][i];

        if (cp[u] == 0) {
            cp[node] = u;
            cp[u] = node;
            return true;
        }
    }

    for (int i = 0; i < G[node].size(); ++ i) {
        int u = G[node][i];

        if (cp[u] != 0) {
            int v = cp[u];

            cp[node] = u;
            cp[u] = node;

            cp[v] = 0;

            if (match(v) == true)
                return true;
            else {
                cp[node] = 0;

                cp[u] = v;
                cp[v] = u;
            }
        }
    }

    return false;
}

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

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

    for (int i = 1, u, v; i <= K; ++ i) {
        fin >> u >> v;

        v += n;

        G[u].push_back(v);
        G[v].push_back(u);
    }

    while (1) {
        for (int i = 1; i <= n + m; ++ i)
            f[i] = false;

        bool ok = false;

        for (int i = 1; i <= n; ++ i)
            if (cp[i] == 0 && match(i) == true)
                ok = true;

        if (ok == false)
            break;
    }

    int cnt = 0;

    for (int i = 1; i <= n; ++ i)
        if (cp[i] != 0)
            ++ cnt;

    fout << cnt << "\n";

    for (int i = 1; i <= n; ++ i)
        if (cp[i] != 0)
            fout << i << " " << cp[i] - n << "\n";

    return 0;
}