제출 #1144642

#제출 시각아이디문제언어결과실행 시간메모리
1144642mnbvcxz123Povjerenstvo (COI22_povjerenstvo)C++20
100 / 100
609 ms149172 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define arr array 
#define vec vector 
#define pii pair<int, int>
#define fir first 
#define sec second 
const int N = 5e5 + 5;

int n, m;
arr<vec<int>, N> in, out;

arr<bool, N> tp_vs;
vec<int> tp;
void tp_dfs(int u) {
    tp_vs[u] = true;
    for (int v : out[u])
        if (!tp_vs[v]) tp_dfs(v);
    tp.push_back(u);
}
int nm_sccs;
arr<int, N> scc;
arr<vec<int>, N> scc_nds;
void scc_dfs(int u) {
    scc[u] = nm_sccs, scc_nds[nm_sccs].push_back(u);
    for (int v : in[u])
        if (!scc[v]) scc_dfs(v);
}
void prcmp() {
    for (int u = 1; u <= n; u++)
        if (!tp_vs[u]) tp_dfs(u);
    reverse(tp.begin(), tp.end());

    for (int u : tp) 
        if (!scc[u]) nm_sccs++, scc_dfs(u);

    // for (int i = 1; i <= nm_sccs; i++) {
    //     cout << i << ": ";
    //     for (int u : scc_nds[i]) cout << u << " ";
    //     cout << endl;
    // }
}

arr<int, N> typ, cnt;
set<pii> ord;
void intl(int id) {
    ord.clear();
    for (int u : scc_nds[id]) {
        if (typ[u] != 0) continue;
        for (int v : out[u])
            cnt[u] += (typ[v] == 0);
        ord.insert({cnt[u], u});
    }
}
void rmv(int u) {
    if (!ord.count({cnt[u], u})) return;
    ord.erase({cnt[u], u});
    for (int v : in[u]) {
        if (!ord.count({cnt[v], v})) continue;
        ord.erase({cnt[v], v});
        cnt[v]--;
        ord.insert({cnt[v], v});
    }
}
arr<int, N> cl;
void cl_dfs(int u) {
    for (int v : out[u]) {
        if (cl[v] || scc[v] != scc[u]) continue;
        cl[v] = (cl[u] == 1) ? 2 : 1;
        cl_dfs(v);
    }
}
void slv(int id) {
    intl(id);
    while (ord.size() && ord.begin()->fir == 0) {
        int u = ord.begin()->sec;
        ord.erase(ord.begin());
        typ[u] = 1, rmv(u);
        for (int v : in[u])
            typ[v] = 2, rmv(v);
    }

    cl[scc_nds[id][0]] = 1, cl_dfs(scc_nds[id][0]);
    for (int u : scc_nds[id]) {
        if (typ[u] != 0) continue;
        if (cl[u] != 1) continue;
        typ[u] = 1;
        for (int v : in[u]) typ[v] = 2;
    }
}

void cmp() {
    for (int i = nm_sccs; i >= 1; i--) 
        slv(i);

    vec<int> ans;
    for (int u = 1; u <= n; u++) {
        assert(typ[u] != 0);
        if (typ[u] == 1) ans.push_back(u);        
    }
    cout << ans.size() << endl;
    for (int u : ans) cout << u << " ";
    cout << endl;
}

signed main() {
    // freopen("a.in", "r", stdin);
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int u, v; cin >> u >> v;
        out[u].push_back(v), in[v].push_back(u);
    }

    prcmp();
    cmp();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...