File tree Expand file tree Collapse file tree 1 file changed +77
-0
lines changed
Expand file tree Collapse file tree 1 file changed +77
-0
lines changed Original file line number Diff line number Diff line change 1+ ``` cpp
2+ #include < bits/stdc++.h>
3+ using namespace std ;
4+
5+ int N, M;
6+ vector<vector<int >> g (200001), r(200001), v(200001);
7+ bitset<200001> vis;
8+ stack<int > st;
9+ int num[ 200001] {}, deg[ 200001] {}, dp[ 200001] {};
10+
11+ void dfs1(int n) {
12+ for(int i: g [ n] ) if(!vis[ i] ) {
13+ vis[ i] = 1;
14+ dfs1(i);
15+ }
16+ st.push(n);
17+ }
18+
19+ void dfs2(int n, int k) {
20+ num[ n] = k;
21+ for(int i: r [ n] ) if(!vis[ i] ) {
22+ vis[ i] = 1;
23+ dfs2(i, k);
24+ }
25+ }
26+
27+ int main(){
28+ cin.tie(0)->sync_with_stdio(0);
29+
30+ cin>>N>>M;
31+ for(int a,b;M--;) {
32+ cin>>a>>b;
33+ g[a].push_back(b);
34+ r[b].push_back(a);
35+ }
36+
37+ for(int i=1;i<=N;i++) if(!vis[i]) {
38+ vis[i] = 1;
39+ dfs1(i);
40+ }
41+
42+ int cnt = 0;
43+ vis.reset();
44+ while(!st.empty()) {
45+ int n = st.top(); st.pop();
46+ if(vis[n]) continue;
47+ vis[n] = 1;
48+ dfs2(n, ++cnt);
49+ }
50+
51+ for(int i=1;i<=N;i++) for(int j:g[i]) if(num[i] != num[j]) {
52+ deg[num[i]]++;
53+ v[num[j]].push_back(num[i]);
54+ }
55+
56+ queue<int> q;
57+ for(int i=1;i<=cnt;i++) if(!deg[i]) {
58+ q.push(i);
59+ dp[i] = 1;
60+ }
61+
62+ while(!q.empty()) {
63+ int n = q.front(); q.pop();
64+ for(int i:v[n]) {
65+ if(!--deg[i]) q.push(i);
66+ dp[i] = max(dp[i], dp[n] + 1);
67+ }
68+ }
69+
70+ vector<int> ans;
71+ for(int i=1;i<=N;i++) if(dp[num[i]] == cnt) ans.push_back(i);
72+
73+ cout<<ans.size()<<'\n';
74+ for(int i:ans) cout<<i<<' ';
75+
76+ }
77+ ```
You can’t perform that action at this time.
0 commit comments