Cod sursa(job #1803525)

Utilizator BrandonChris Luntraru Brandon Data 11 noiembrie 2016 16:06:08
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

ifstream cin ("cuplaj.in");
ofstream cout ("cuplaj.out");

const int MaxN = 10005;

vector <int> G[MaxN];
int n, m, e;
bool Done;
int LfCouple[MaxN], RgCouple[MaxN];
bool used[MaxN];

bool Cuplaj(int node) {
    if (used[node]) {
        return false;
    }

    used[node] = true;
    for (auto nxt: G[node]) {
        if (!RgCouple[nxt]) {
            RgCouple[nxt] = node;
            LfCouple[node] = nxt;
            return true;
        }
    }

    for (auto nxt: G[node]) {
        if (Cuplaj(RgCouple[nxt])) {
            RgCouple[nxt] = node;
            LfCouple[node] = nxt;
            return true;
        }
    }

    return false;
}

int main() {
    cin >> n >> m >> e;
    for (int i = 1; i <= e; ++i) {
        int a, b;
        cin >> a >> b;
        G[a].push_back(b);
        //G[b].push_back(a);
    }

    Done = false;
    while (!Done) {
        memset(used, false, sizeof used);
        Done = true;
        for (int i = 1; i <= n; ++i) {
            if (LfCouple[i]) {
                continue;
            }

            if (Cuplaj(i)) {
                Done = false;
            }
        }
    }

    int Ans = 0;
    for (int i = 1; i <= n; ++i) {
        if (LfCouple[i]) {
            ++Ans;
        }
    }

    cout << Ans << '\n';
    for (int i = 1; i <= n; ++i) {
        if (LfCouple[i]) {
            cout << i << ' ' << LfCouple[i] << '\n';
        }
    }
    return 0;
}