Cod sursa(job #2247392)

Utilizator osiaccrCristian Osiac osiaccr Data 28 septembrie 2018 15:48:37
Problema Felinare Scor 2
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <fstream>
#include <vector>
#include <bitset>
#define DEF 9000

using namespace std;

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

int n, m, nr_Cup, L[DEF], R[DEF], Sl[DEF], Sr[DEF];

vector < int > V[DEF], S;

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;
            ++ nr_Cup;
            Sl[nod] = 1;
            return 1;
        }
    }

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

    return 0;

}

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

            calc (L[vecin]);
        }
    }
}

int main () {

    fin >> n >> m;

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

    bool ok;
    do {

        ok = false;

        Viz.reset ();

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

    } while (ok);

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

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

    return 0;
}