Cod sursa(job #1376931)

Utilizator Alexghita96Ghita Alexandru Alexghita96 Data 5 martie 2015 19:25:31
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <cstdio>
#include <vector>
#include <cstring>

#define NMAX 10005

using namespace std;

int N, M, E, L[NMAX], R[NMAX], nr_muchii;
bool modif, viz[NMAX];
vector <int> G[NMAX];

void citire()
{
    int a, b;

    scanf("%d %d %d", &N, &M, &E);

    for (int i = 1; i <= E; ++i)
    {
        scanf("%d %d", &a, &b);
        G[a].push_back(b);
    }
}

bool cuplaj(int nod)
{
    vector <int> :: iterator it;

    if (viz[nod] == true)
        return false;

    viz[nod] = true;

    for (it = G[nod].begin(); it != G[nod].end(); ++it)
    {
        if (R[*it] == 0 || cuplaj(R[*it]))
        {
            L[nod] = *it;
            R[*it] = nod;
            return true;
        }
    }

    return false;
}

void rezolvare()
{
    do
    {
        modif = false;
        memset(viz, 0, sizeof(viz));
        for (int i = 1; i <= N; ++i)
        {
            if (L[i] == 0)
            {
                bool val = cuplaj(i);
                modif = (modif || val);
                if (val == true)
                    nr_muchii++;
            }
        }
    }while (modif == true);
}

void afisare()
{
    printf("%d\n", nr_muchii);
    for (int i = 1; i <= N; ++i)
        if (L[i] != 0)
            printf("%d %d\n", i, L[i]);
}

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

    citire();
    rezolvare();
    afisare();

    return 0;
}