Cod sursa(job #2641556)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 11 august 2020 22:48:50
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <iostream>
#include <bitset>
using namespace std;

const int DIM = 10005;

bitset<DIM> mrk;
vector<int> edg[DIM];
int lef[DIM], rig[DIM];

bool match(int x) {
    if (mrk[x])
        return false;
    mrk[x] = true;

    for (int y : edg[x]) if (!rig[y]) {
        lef[x] = y; rig[y] = x;
        return true;
    }

    for (int y : edg[x]) if (match(rig[y])) {
        lef[x] = y; rig[y] = x;
        return true;
    }

    return false;
}

int main(void) {
    freopen("cuplaj.in", "r", stdin);
    freopen("cuplaj.out", "w", stdout);
    int n, m, k;
    cin >> n >> m >> k;
    for (int i = 1; i <= k; ++i) {
        int x, y;
        cin >> x >> y;
        edg[x].push_back(y);
    }
    bool ok;
    do {
        ok = false; mrk.reset();
        for (int i = 1; i <= n; ++i)
            if (!lef[i] && match(i))
                ok = true;
    } while (ok);
    int nr = 0;
    for (int i = 1; i <= n; ++i) {
        if (lef[i])
            ++nr;
    }
    cout << nr << "\n";
    for (int i = 1; i <= n; ++i) {
        if (lef[i])
            cout << i << " " << lef[i] << "\n";
    }
    return 0;
}