Cod sursa(job #2737778)

Utilizator Leonard123Mirt Leonard Leonard123 Data 5 aprilie 2021 09:39:23
Problema Felinare Scor 10
Compilator cpp-64 Status done
Runda oni_wellcode_day_5 Marime 1.36 kb
#include<fstream>
#include<algorithm>
#include<vector>
using namespace std;

const int N = 8200;
vector<int> road[N], backward[N];
vector<pair<int, int>> order;
int n, m, grad[2][N], done[2][N], open[2][N], x, y, total;

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

int main() {
    cin >> n >> m;
    while (m--)  {
        cin >> x >> y;
        road[x].push_back(y);
        backward[y].push_back(x);
        grad[0][x]++;
        grad[1][y]++;
    }
    for (int i = 1; i <= n; i++) {
        order.push_back({grad[0][i], i});
        order.push_back({grad[1][i], -i});
    }
    sort(order.begin(), order.end());
    for (auto who : order) {
        int cgrad = 0, cnod = abs(who.second);

        if (who.second < 0) 
            cgrad = 1; 

        if (done[cgrad][cnod])
            continue;

        total++;
        open[cgrad][cnod] = 1;

        if (cgrad == 0) {
            for (auto next : road[cnod]) 
                done[cgrad ^ 1][next] = 1;
        } else {
            for (auto next : backward[cnod]) 
                done[cgrad ^ 1][next] = 1;
        }
    }

    cout << total << "\n";
    for (int i = 1; i <= n; i++) {
        if (open[0][i] && open[1][i])
            cout << "3\n";
        else if (open[0][i])
            cout << "1\n";
        else if (open[1][i])
            cout << "2\n";
        else 
            cout << "0\n";
    }
}