Skip to content

Commit 7b6cc7c

Browse files
authored
[20251201] BOJ / P3 / 즉흥 여행 (Hard) / 권혁준
1 parent 34b4809 commit 7b6cc7c

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
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+
```

0 commit comments

Comments
 (0)