Cod sursa(job #1405160)

Utilizator thewildnathNathan Wildenberg thewildnath Data 28 martie 2015 21:59:08
Problema Felinare Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

const int NMAX = 8191;

int N, M, cuplaj;

int cupl1[NMAX + 1], cupl2[NMAX + 1];
bool sl[NMAX + 1], sr[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;

            return true;
        }
    }

    return false;
}

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

        if (!sr[csp]) {
            sr[csp] = true;
            sl[cupl2[csp]] = false;

            ilum (cupl2[csp]);
        }
    }
}

void rezolva () {
    bool ok;

    do {
        ok = false;
        memset (viz, 0, sizeof (viz));

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

    for (int i = 1; i <= N; ++i)
        if (!sl[i])
            ilum (i);
}

void afisare () {
    printf ("%d\n", 2 * N - cuplaj);

    for (int i = 1; i <= N; ++i) {
        if (sl[i]) {
            if (sr[i])
                printf ("3\n");
            else
                printf ("1\n");
        } else if (sr[i])
            printf ("2\n");
        else
            printf ("0\n");
    }
}

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

    citire ();

    rezolva ();

    afisare ();

    return 0;
}