Cod sursa(job #1687382)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 12 aprilie 2016 20:20:06
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>

#define left(x) (x)
#define right(x) ((x)+10000)

using namespace std;

const int nmax = 1e4 + 10;

int n , m , e , i , ans;
int cuplat[nmax<<1];
bool ap[nmax<<1];

vector < int > g[nmax];

bool pairup(int node)
{
    ap[left(node)] = 1;
    for (auto &it : g[node])
    {
        if (cuplat[right(it)]) continue;

        cuplat[left(node)] = it;
        cuplat[right(it)] = node;
        return 1;
    }

    for (auto &it : g[node])
    {
        if (ap[cuplat[right(it)]]) continue;
        if (!pairup(cuplat[right(it)])) continue;

        cuplat[left(node)] = it;
        cuplat[right(it)] = node;
        return 1;
    }

    return 0;
}

void bagacuplaj()
{
    while (true)
    {
        bool ok = 0;
        memset(ap , 0 , sizeof(ap));

        for (int i = 1; i <= n; ++i)
        {
            if (cuplat[left(i)] || ap[left(i)]) continue;
            ok |= pairup(i);
        }

        if (!ok) break;
    }
}

int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);

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

        g[x].push_back(y);
    }

    bagacuplaj();

    for (i = 1; i <= n; ++i)
        if (cuplat[left(i)]) ans++;

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

    return 0;
}