Cod sursa(job #898546)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 28 februarie 2013 10:39:01
Problema Cuplaj maxim in graf bipartit Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <stdio.h>
#include <vector>
using namespace std;

const int dim = 10002;
int N1, N2, N, M, C[dim], viz[dim];
vector <int> V[dim];

void cit ()
{
    scanf ("%d%d%d", &N1, &N2, &M);
    N = N1 + N2;

    for (int i = 1, x, y; i <= M; i++)
    {
        scanf ("%d%d", &x, &y);
        V[x].push_back (y + N1);
        //V[y].push_back (x);
    }
}

int rec (int n)
{
    if (viz[n] == 1)
        return 0;
    int i, f;
    viz[n] = 1;

    for (i = 0; i < V[n].size(); i++)
    {
        f = V[n][i];
        if (C[f] == 0)
        {
            C[n] = f;
            C[f] = n;
            return 1;
        }
    }

    for (i = 0; i < V[n].size(); i++)
    {
        f = V[n][i];
        if (rec (C[f]))
        {
            C[n] = f;
            C[f] = n;
            return 1;
        }
    }
    return 0;
}

void rez ()
{
    int ok = 1, i;
    while (ok)
    {
        ok = 0;
        for (i = 1; i <= N1; i++)
            viz[i] = 0;

        for (i = 1; i <= N1; i++)
        {
            if (C[i] == 0)
            {
                if (rec (i))
                {
                    ok = 1;
                }
            }
        }
    }
}

void afi ()
{
    int nr = 0, i;
    for (i = 1; i <= N1; i++)
        if (C[i])
            nr++;

    printf ("%d\n", nr);
    for (i = 1; i <= N1; i++)
        if (C[i])
            printf ("%d %d\n", i, C[i] - N1);
}

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

    cit ();
    rez ();
    afi ();

    return 0;
}