Cod sursa(job #229362)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 9 decembrie 2008 22:50:24
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <cstdio>
#include <vector>

using namespace std;

#define L(i) ((i))
#define R(i) ((i) + NL)

#define MAXN 10005

int NL, NR, M;
vector<int> con[MAXN], l, r;
vector<bool> used;

inline int PairUp(int k)
{
    if (used[k])
        return 0;
    used[k] = true;

    vector<int> :: iterator it;
    for (it = con[k].begin(); it != con[k].end(); it++)
    {
        if (r[*it] == -1 || PairUp(r[*it]))
        {
            l[k] = *it;
            r[*it] = k;
            return 1;
        }
    }

    return 0;
}

int main()
{
    freopen("cuplaj.in", "rt", stdin);
    freopen("cuplaj.out", "wt", stdout);

    scanf("%d %d %d", &NL, &NR, &M);
    for (; M; M--)
    {
        int l, r;
        scanf("%d %d", &l, &r);
        l--; r--;

        con[L(l)].push_back(R(r));
    }

    l.resize(NL, -1);
    r.resize(NL + NR, -1);
    for (int ok = 0; !ok; )
    {
        ok = 1;
        used.clear();
        used.resize(NL, false);
        for (int i = 0; i < NL; i++)
            if (l[L(i)] == -1 && PairUp(L(i)))
                ok = 0;
    }

    int Nr = 0;
    for (int i = 0; i < NL; i++)
        if (l[L(i)] != -1)
            Nr++;

    printf("%d\n", Nr);
    for (int i = 0; i < NL; i++)
        if (l[L(i)] != -1)
            printf("%d %d\n", i + 1, l[L(i)] - NL + 1);

    return 0;
}