Cod sursa(job #2737804)

Utilizator teofilotopeniTeofil teofilotopeni Data 5 aprilie 2021 10:38:31
Problema Felinare Scor 0
Compilator cpp-64 Status done
Runda oni_wellcode_day_5 Marime 1.67 kb
#include <bits/stdc++.h>
#include <math.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];
int n, m, maxim = 1, rasp[NMAX];

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;
    }

    queue<int> coada;
    for (coada.push(maxim); coada.size(); coada.pop()) {
        unsigned int act = coada.front(), sosiri = 0;
        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;
            }
        }
    }
    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;
}