Cod sursa(job #445336)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 23 aprilie 2010 16:06:26
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
int n1, n2, m, viz[10002], cuplaj[10002], c[10002];
vector <int> v[10002];

int cupleaza (int nod)
{
    if (viz[nod])
        return 0;
    viz[nod] = 1;
    vector <int> :: iterator it;
    for (it = v[nod].begin(); it != v[nod].end(); it ++)
        if (!cuplaj[*it])
        {
            cuplaj[*it] = nod;
            return 1;
        }
    for (it = v[nod].begin(); it != v[nod].end(); it ++)
        if (cupleaza (cuplaj[*it]))
        {
            cuplaj[*it] = nod;
            return 1;
        }
    return 0;
}

int main()
{
    freopen ("cuplaj.in", "r", stdin);
    freopen ("cuplaj.out", "w", stdout);
    scanf ("%d %d %d", &n1, &n2, &m);
    int i, x, y;
    for (i = 1; i <= m; i ++)
    {
        scanf ("%d %d", &x, &y);
        v[x].push_back (y);
    }

    int ok = 1;
    while (ok)
    {
        ok = 0;
        memset (viz, 0, sizeof (viz));
        for (i = 1; i <= n1; i ++)
            if (!c[i] && cupleaza (i))
            {
                c[i] = 1;
                ok = 1;
            }
    }

    int nr = 0;
    for (i = 1; i <= n2; i ++)
        nr += cuplaj[i] != 0;
    printf ("%d\n", nr);
    for (i = 1; i <= n2; i ++)
        if (cuplaj[i])
            printf ("%d %d\n", cuplaj[i], i);
    return 0;
}