Cod sursa(job #3268943)

Utilizator BuruianaRaresAndreiBuruiana Rares Andrei BuruianaRaresAndrei Data 18 ianuarie 2025 09:47:03
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>

#define int long long
#define pii pair<int, int>
#define fs first
#define sd second

using namespace std;

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

int n1, n2, n, m;
int mt[20005], l[20005];
bitset<20005> used;
vector<int> g[20005];
int change;
vector<pii> ans;

bool try_kuhn(int node) {
    if(used[node])
        return false;
    used[node] = true;
    for(auto nxt : g[node]) {
        if(mt[nxt] == -1 || try_kuhn(mt[nxt])) {
            l[node] = nxt;
            mt[nxt] = node;
            return true;
        }
    }
    return false;
}

signed main() {
    in >> n1 >> n2 >> m;
    n = n1 + n2;
    for(int i = 1; i <= m; i++) {
        int u, v; in >> u >> v;
        g[u].push_back(v);
    }

    for(int i = 1; i <= n2; i++) {
        mt[i] = -1;
    }
    for(int i = 1; i <= n1; i++) {
        l[i] = -1;
    }
    change = 1;
    while(change) {
        change = 0;
        used = 0;
        for(int i = 1; i <= n1; i++) {
            if(l[i] == -1) {
                change |= try_kuhn(i);
            }
        }
    }

    for(int i = 1; i <= n2; i++) {
        if(mt[i] != -1) {
            ans.push_back({mt[i], i});
        }
    }
    sort(ans.begin(), ans.end());
    out << ans.size() << '\n';
    for(auto elem : ans) {
        out << elem.fs << ' ' << elem.sd << '\n';
    }

    return 0;
}