Cod sursa(job #2247415)

Utilizator osiaccrCristian Osiac osiaccr Data 28 septembrie 2018 16:24:01
Problema Felinare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <fstream>
#include <vector>
#include <bitset>
#define DEF 20000

using namespace std;

ifstream fin ("felinare.in");
ofstream fout ("felinare.out");

int n, m, nr_Cup, L[DEF], R[DEF], S[DEF];

vector < int > V[DEF];

bitset < DEF > Viz;

int cupleaza (int nod) {

    if (Viz[nod])
        return 0;

    Viz[nod] = true;

    for (int i = 0; i < V[nod].size (); ++ i) {
        int vecin = V[nod][i];
        if (R[vecin] == 0) {
            L[nod] = vecin;
            R[vecin] = nod;
            return 1;
        }
    }

    for (int i = 0; i < V[nod].size (); ++ i) {
        int vecin = V[nod][i];
        if (cupleaza (R[vecin])) {
            L[nod] = vecin;
            R[vecin] = nod;
            return 1;
        }
    }

    return 0;

}

void calc (int nod) {
    for (int i = 0; i < V[nod].size (); ++ i) {
        int vecin = V[nod][i];
        if (!S[vecin]) {
            S[vecin] = 1;
            S[R[vecin]] = 0;

            calc (R[vecin]);
        }
    }
}

int main () {

    fin >> n >> m;

    for (int i = 1; i <= m; ++ i) {
        int x, y;
        fin >> x >> y;
        V[x].push_back (n + y);
    }

    bool ok;
    do {

        ok = false;

        Viz.reset ();

        for (int i = 1; i <= n; ++ i) {
            if (L[i] == 0) {
                ok |= cupleaza (i);
            }
        }

    } while (ok);

    for (int i = 1; i <= n; ++ i) {
        if (L[i]) {
            S[i] = 1;
        }
    }

    for (int i = 1; i <= n; ++ i) {
        if (L[i] == 0) {
            calc (i);
        }
    }

    for (int i = 1; i <= 2 * n; ++ i) {
        nr_Cup += S[i];
    }

    fout << 2 * n - nr_Cup << "\n";

    for (int i = 1; i <= n; ++ i) {
        fout << 1 - S[i] + 2 * (1 - S[i + n]) << "\n";
    }

    return 0;
}