Cod sursa(job #950185)

Utilizator cristi_berceanuFMI - Cristi Berceanu cristi_berceanu Data 16 mai 2013 00:52:35
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
// Berceanu Cristian
#define MAXN  10005

#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>

using namespace std;

vector <int> G[MAXN];

int l[MAXN], r[MAXN], u[MAXN];


int cuplaj(const int n)
{
    vector <int>::iterator it;
    if (u[n])  return 0;
    u[n] = 1;
    for(it=G[n].begin();it!=G[n].end();++it)if (!r[*it]) {
        l[n] = *it;
        r[*it] = n;
        return 1;
    }
    for(it=G[n].begin();it!=G[n].end();++it) if (cuplaj(r[*it])) {
        l[n] = *it;
        r[*it] = n;
        return 1;
    }
    return 0;
}

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

    int n, m, c;
    scanf("%d %d %d", &n, &m, &c);

    for (; c--; )
    {
        int x, y;
        scanf("%d %d", &x, &y);
        G[x].push_back(y);
    }
    for (int ok = 1; ok; )
    {
        ok = 0;
        memset(u, 0, sizeof(u));
        for(int i=1;i<=n;++i) if (!l[i])
            ok |= cuplaj(i);
    }
    int cup = 0;
    for(int i=1;i<=n;++i)  cup += (l[i] > 0);
        printf("%d\n", cup);
    for(int i=1;i<=n;++i) if (l[i] > 0)
        printf("%d %d\n", i, l[i]);

    return 0;
}