Cod sursa(job #1405113)

Utilizator thewildnathNathan Wildenberg thewildnath Data 28 martie 2015 21:05:11
Problema Felinare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <cstdio>
#include <vector>

using namespace std;

const int NMAX = 8191;

int N, M, cuplaj;

int cupl1[NMAX + 1], cupl2[NMAX + 1];
bool viz[NMAX + 1];

vector<int> v1[NMAX + 1], v2[NMAX + 1];

void citire () {
    int x, y;
    scanf ("%d%d", &N, &M);

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

bool cupleaza (int nod) {
    if (viz[nod])
        return false;
    viz[nod] = true;

    for (int i = 0; i < v1[nod].size (); ++i) {
        int csp = v1[nod][i];

        if (!cupl2[csp]) {
            cupl1[nod] = csp;
            cupl2[csp] = nod;

            ++cuplaj;
            return true;
        }
    }

    for (int i = 0; i < v1[nod].size (); ++i) {
        int csp = v1[nod][i];

        if (cupleaza(cupl2[csp])) {
            cupl1[nod] = csp;
            cupl2[csp] = nod;

            ++cuplaj;
            return true;
        }
    }

    return false;
}

void rezolva () {
    bool ok;

    do {
        ok = false;

        for (int i = 1; i <= N; ++i)
            if (!cupl1[i])
                ok |= cupleaza (i);
    } while (ok);


    printf ("%d\n", 2 * N - cuplaj);
}

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

    citire ();

    rezolva ();

    return 0;
}