Cod sursa(job #2737937)

Utilizator teofilotopeniTeofil teofilotopeni Data 5 aprilie 2021 12:29:16
Problema Felinare Scor 0
Compilator cpp-64 Status done
Runda oni_wellcode_day_5 Marime 1.96 kb
#include <bits/stdc++.h>
using namespace std;

#define cin in
//#define cout out
#define run(n) for (int i = 1; i <= n; i++)
ifstream in("felinare.in");
ofstream out("felinare.out");
const int NMAX = 9200;
vector<int> plec[NMAX], ven[NMAX];
pair<int, int> fel[NMAX];
bitset<NMAX> parcurse;
int n, m, maxim = 1, rasp[NMAX];

void parcurge(int index) {
    queue<int> coada;
    for (coada.push(index); coada.size(); coada.pop()) {
        unsigned int act = coada.front(), sosiri = 0;
        if (plec[act].size()) {
            for (int to : plec[act])
                if (!fel[to].first)
                    if (ven[to].size() > sosiri)
                        sosiri = ven[to].size();

            if (sosiri >= plec[act].size()) {
                fel[act].second = 1;
                sosiri = -1;
            }
            else {
                fel[act].second = -1;
                sosiri = 1;
            }

            for (int to : plec[act]) {
                if (!fel[to].first) {
                    coada.push(to);
                    fel[to].first = sosiri;
                    parcurse[to] = 1;
                }
            }
        }
        else
            fel[act].second = 1;
    }
}

int main() {
    cin >> n >> m;
    while (m--) {
        int a, b;
        cin >> a >> b;
        plec[a].push_back(b);
        ven[b].push_back(a);
        if (plec[a].size() > plec[maxim].size())
            maxim = a;
    }

    run(n) {
        if (plec[i].empty())
            fel[i].second = 1;
        if (ven[i].empty())
            fel[i].first = 1;
    }

    parcurse[maxim] = 1;
    parcurge(maxim);
    maxim = 0;
    run(n) {
        fel[i].first = fel[i].first >= 0;
        fel[i].second = fel[i].second >= 0;
        maxim += fel[i].first + fel[i].second;
        rasp[i] = fel[i].first * 2 + fel[i].second;
    }
    cout << maxim << '\n';
    run(n)
        cout << rasp[i] << '\n';
    return 0;
}