Cod sursa(job #3302914)

Utilizator Nasa1004Ema Nicole Gheorghe Nasa1004 Data 11 iulie 2025 23:19:19
Problema Felinare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.57 kb
#include <fstream>
#include <algorithm>
#include <random>
#include <vector>
#include <bitset>

using namespace std;
const int NMAX = 8193;

ifstream cin("felinare.in");
ofstream cout("felinare.out");

vector <vector <int>> v;
vector <int> ord;

bitset <NMAX> f1, f2;
int cuplaj_st[NMAX], cuplaj_dr[NMAX];

int pair_up(int start) {
    if(f1[start])
        return 0;
    f1[start] = 1;
    for(const int& vec : v[start]) {
        if(!cuplaj_dr[vec]) {
            cuplaj_st[start] = vec;
            cuplaj_dr[vec] = start;
            return 1;
        }
    }
    for(const int& vec : v[start]) {
        if(cuplaj_dr[vec] != start && pair_up(cuplaj_dr[vec])) {
            cuplaj_st[start] = vec;
            cuplaj_dr[vec] = start;
            return 1;
        }
    }
    return 0;
}

void dfs(int start) { ///suntem pe partea st
    f1[start] = 0;
    for(auto vec : v[start]) {
        if(cuplaj_st[start] != vec && !f2[vec]) {
            f2[vec] = 1;
            if(f1[cuplaj_dr[vec]]) ///dc e nevoie (care ar TREBUI always), mergem pe muchia de cuplaj
                dfs(cuplaj_dr[vec]);
        }
    }
}

int main() {
    int n, m;
    cin >> n >> m;
    v.resize(n + 1);
    for(int i = 1; i <= m; i++) {
        int a, b;
        cin >> a >> b;
        v[a].push_back(b);
    }
    ///P1) Cuplaj
    mt19937 g(23214235);
    for(int i = 1; i <= n; i++)
        ord.push_back(i);
    shuffle(ord.begin(), ord.end(), g);

    while(1) {
        f1 = 0;
        int cnt = 0;
        for(auto i : ord) {
            if(!cuplaj_st[i])
                cnt += pair_up(i);
        }
        if(!cnt)
            break;
    }
    /*for(int i = 1; i <= n; i++) {
        if(cuplaj_st[i])
            cout << i << " " << cuplaj_st[i] << '\n';
    }*/

    ///P2) MVC
    ///ce are f[i] = 1 --> ESTE in solutie
    for(int i = 1; i <= n; i++) ///la inceput toate sunt, le scoatem DOAR dc trecem prin ele
        f1[i] = 1;
    f2 = 0;
    for(int i = 1; i <= n; i++) {
        if(!cuplaj_st[i]) ///facem dfs
            dfs(i);
    }

    ///P3) MIS
    int ans = 0;
    for(int i = 1; i <= n; i++) {
        ans += (!f1[i]);
        ans += (!f2[i]);
    }
    cout << ans << '\n';
    for(int i = 1; i <= n; i++) {
        int cnt = 0;
        if(!f1[i])
            cnt++;
        if(!f2[i])
            cnt += 2;
        cout << cnt << '\n';
    }
    /*cout << "St: ";
    for(int i = 1; i <= n; i++) {
        if(f1[i])
            cout << i << " ";
    }
    cout << '\n';
    cout << "Dr: ";
    for(int i = 1; i <= n; i++) {
        if(f2[i])
            cout << i << " ";
    }
    cout << '\n';*/
    return 0;
}