Cod sursa(job #3348299)

Utilizator bogdan1479Luca Bogdan Alexandru bogdan1479 Data 20 martie 2026 16:31:42
Problema Felinare Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>
#include <bitset>
#include <vector>

using namespace std;

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

const int NMAX = 8192;

int n, m, cuplaj;

bitset<NMAX> viz;
int l[NMAX], r[NMAX];

vector<int> G[NMAX];

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

bool dfs(int x) {
    if(viz[x]) return 0;
    viz[x] = 1;

    for(const auto& y : G[x]) {
        if(!r[y] || dfs(r[y])) {
            l[x] = y;
            r[y] = x;
            return 1;
        }
    }
    return 0;
}

void karp() {
    bool amSchimbat;

    do {
        amSchimbat = 0;
        viz.reset();

        for(int i = 1; i <= n; ++i) {
            if(!l[i] && dfs(i)) {
                amSchimbat = 1;
                ++cuplaj;
            }
        }
    } while(amSchimbat);
}

void reconstructie() {
    for(int i = 1; i <= n; ++i) {
        if(l[i] && r[i]) {
            fout << "0\n";
        } else if(r[i]) {
            fout << "1\n";
        } else if(l[i]) {
            fout << "2\n";
        } else {
            fout << "3\n";
        }
    }
}

int main() {
    citire();
    karp();
    fout << 2 * n - cuplaj << '\n';
    reconstructie();
    return 0;
}