Cod sursa(job #3152070)

Utilizator TeddyDinutaDinuta Eduard Stefan TeddyDinuta Data 23 septembrie 2023 17:52:56
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
int n, m, cnt, x, y;
vector<int> adj[10005];
int l[10005], r[10005];
bool vis[10005];

int pairup(int nod) {
    if (vis[nod])
        return 0;

    vis[nod] = 1;

    for (auto i : adj[nod])
        if (!r[i]) {
            l[nod] = i;
            r[i] = nod;
            return 1;
        }

    for (auto i : adj[nod]) {
        if (pairup(r[i])) {
            l[nod] = i;
            r[i] = nod;
            return 1;
        }
    }

    return 0;
}

int main()
{
    in >> n >> m >> cnt;
    for (int i = 1; i <= cnt; i++) {
        in >> x >> y;
        adj[x].push_back(y);
    }

    bool change = 1;
    while (change == 1) {
        change = 0;
        memset(vis, 0, sizeof(vis));

        for (int i = 1; i <= n; i++)
            if (!l[i])
                change |= pairup(i);
    }

    int ans = 0;
    for (int i = 1; i <= n; i++)
        ans += (l[i] > 0);

    out << ans << '\n';
    for (int i = 1; i <= n; i++)
        if (l[i] > 0)
            out << i << " " << l[i] << '\n';
    return 0;
}