Cod sursa(job #1686965)

Utilizator papinubPapa Victor papinub Data 12 aprilie 2016 16:02:00
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
# include <cstdio>
# include <vector>
using namespace std;

FILE *f = freopen("cuplaj.in", "r", stdin);
FILE *g = freopen("cuplaj.out", "w", stdout);

const int N_MAX = 100001;

vector <int> G[N_MAX];

int left[N_MAX];
int right[N_MAX];
bool checked[N_MAX];
int sol;
int n, m, k;

void read()
{
    scanf("%d %d %d", &n, &m, &k);

    for (int i=1; i<=k; i++)
    {
        int x, y;
        scanf("%d %d", &x, &y);

        G[x].push_back(y);
    }
}

bool cupleaza(int nod)
{
    if (checked[nod])
        return false;

    checked[nod] = true;

    for (int vecin : G[nod])
    {
        if (!right[vecin]) /// nu a fost cuplat
        {
            left[nod] = vecin;
            right[vecin] = nod;
            sol ++;
            return true;
        }
    }

    for (int vecin : G[nod])
    {
        /// decuplam nodul de care este legat
        if (cupleaza(right[vecin]))
        {
            left[nod] = vecin;
            right[vecin] = nod;
            return true;
        }
    }

    return false;
}

void solve()
{
    bool ok = true;

    while (ok) /// atata timp cat putem cupla
    {
        for (int i=1; i<=n; i++)
            checked[i] = false;

        ok = false;

        for (int i=1; i<=n; i++)
            if (!left[i])
                if (cupleaza(i))
                    ok = true;
    }

    printf("%d\n", sol);

    for (int i=1; i<=n; i++)
    {
        if (left[i])
            printf("%d %d\n", i ,left[i]);
    }
}

int main()
{
    read();
    solve();
    return 0;
}