Cod sursa(job #2044093)

Utilizator stefanzzzStefan Popa stefanzzz Data 20 octombrie 2017 21:32:52
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <vector>
#include <cstring>
#define MAXN 10005
#define MAXM 10005
using namespace std;

int n, m, nre;
int L[MAXN], R[MAXM];
vector<int> G[MAXN];
bool used[MAXN];

bool pairup(int u) {
    used[u] = 1;

    for (auto x: G[u]) {
        if (!R[x]) {
            L[u] = x;
            R[x] = u;
            return 1;
        }
    }

    for (auto x: G[u]) {
        if (!used[R[x]] && pairup(R[x])) {
            L[u] = x;
            R[x] = u;
            return 1;
        }
    }

    return 0;
}

int main() {

    cin >> n >> m >> nre;
    for (int i = 1; i <= nre; ++i) {
        int u, v;
        cin >> u >> v;
        G[u].push_back(v);
    }

    bool done = 0;
    while(!done) {
        done = 1;
        memset(used, 0, sizeof(used));

        for (int i = 1; i <= n; ++i) {
            if (!L[i] && pairup(i))
                done = 0;
        }
    }

    int sol = 0;
    for (int i = 1; i <= n; ++i)
        sol += (L[i] > 0);

    cout << sol << "\n";
    for (int i = 1; i <= n; ++i) {
        if (L[i] > 0) {
            cout << i << " " << L[i] << "\n";
        }
    }

    return 0;
}