Cod sursa(job #2786375)

Utilizator UnknownPercentageBuca Mihnea-Vicentiu UnknownPercentage Data 20 octombrie 2021 20:05:03
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>

using namespace std;

inline void Open(const string Name) {
    #ifndef ONLINE_JUDGE
        (void)!freopen((Name + ".in").c_str(), "r", stdin);
        (void)!freopen((Name + ".out").c_str(), "w", stdout);
    #endif
}

vector <int> Gr[10001];

int viz[10001], r[10001], l[10001];
int N, M, E, x, y, cnt;

bool ok;

bool pair_up(int v) {
    viz[v] = 1;

    for(int &to : Gr[v]) {
        if(!r[to]) {
            l[v] = to;
            r[to] = v;
            return 1;
        }
    }

    for(int &to : Gr[v]) {
        if(!viz[r[to]] && pair_up(r[to])) {
            l[v] = to;
            r[to] = v;
            return 1;
        }
    }

    return 0;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    Open("cuplaj");

    cin >> N >> M >> E;
    while(E--) {
        cin >> x >> y;
        Gr[x].emplace_back(y);
    }

    do {
        ok = 0;
        memset(viz, 0, sizeof(viz));
        for(int i = 1;i <= N;i++)
            if(!l[i] && pair_up(i)) ok = 1;
    }while(ok);

    for(int i = 1;i <= N;i++)
        cnt += (int)(l[i] > 0);

    cout << cnt << "\n";
    for(int i = 1;i <= N;i++)
        if(l[i] > 0) cout << i << " " << l[i] << "\n";

    return 0;
}