Cod sursa(job #3041827)

Utilizator Cosmin2004_InfoMoldoveanu Cosmin Cosmin2004_Info Data 1 aprilie 2023 21:30:08
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>

using namespace std;
const int N = 1e5 + 5;
int n, m, e;
int l[N], r[N];
bool vis[N];
vector <int> g[N];
void add_edge(int u, int v) { g[u].push_back(v); }
bool pairup(int u) {
    if(vis[u]) return false;
    vis[u] = true;
    for(int v : g[u]) if(!l[v])
        return r[l[v] = u] = v, true;
    for(int v : g[u]) if(pairup(l[v]))
        return r[l[v] = u] = v, true;
    return false;
}

int main()
{
#ifndef HOME
    ifstream cin("cuplaj.in");
    ofstream cout("cuplaj.out");
#else
    ios_base :: sync_with_stdio(false); cin.tie(0);
#endif
    cin >> n >> m >> e;
    for(int i = 0, u, v; i < e; i++)
        cin >> u >> v,
        add_edge(u, v);
    while(true) {
        fill(vis, vis + n + 1, 0);
        bool ok = false;
        for(int i = 1; i <= n; i++)
            if(!r[i])
                ok |= pairup(i);
        if(!ok) break;
    }
    vector <pair <int, int>> sol;
    for(int i = 1; i <= n; i++)
        if(r[i])
            sol.emplace_back(i, r[i]);
    cout << sol.size() << "\n";
    for(auto [x, y] : sol)
        cout << x << " " << y << "\n";
    return 0;
}