From 7b6cc7c79416b06c7cceec7e68f49fd1bbd8b455 Mon Sep 17 00:00:00 2001 From: oncsr Date: Mon, 1 Dec 2025 12:34:45 +0900 Subject: [PATCH] =?UTF-8?q?[20251201]=20BOJ=20/=20P3=20/=20=EC=A6=89?= =?UTF-8?q?=ED=9D=A5=20=EC=97=AC=ED=96=89=20(Hard)=20/=20=EA=B6=8C?= =?UTF-8?q?=ED=98=81=EC=A4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...35\245 \354\227\254\355\226\211 (Hard).md" | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 "khj20006/202512/01 BOJ P3 \354\246\211\355\235\245 \354\227\254\355\226\211 (Hard).md" diff --git "a/khj20006/202512/01 BOJ P3 \354\246\211\355\235\245 \354\227\254\355\226\211 (Hard).md" "b/khj20006/202512/01 BOJ P3 \354\246\211\355\235\245 \354\227\254\355\226\211 (Hard).md" new file mode 100644 index 00000000..901148ea --- /dev/null +++ "b/khj20006/202512/01 BOJ P3 \354\246\211\355\235\245 \354\227\254\355\226\211 (Hard).md" @@ -0,0 +1,77 @@ +```cpp +#include +using namespace std; + +int N, M; +vector> g(200001), r(200001), v(200001); +bitset<200001> vis; +stack st; +int num[200001]{}, deg[200001]{}, dp[200001]{}; + +void dfs1(int n) { + for(int i:g[n]) if(!vis[i]) { + vis[i] = 1; + dfs1(i); + } + st.push(n); +} + +void dfs2(int n, int k) { + num[n] = k; + for(int i:r[n]) if(!vis[i]) { + vis[i] = 1; + dfs2(i, k); + } +} + +int main(){ + cin.tie(0)->sync_with_stdio(0); + + cin>>N>>M; + for(int a,b;M--;) { + cin>>a>>b; + g[a].push_back(b); + r[b].push_back(a); + } + + for(int i=1;i<=N;i++) if(!vis[i]) { + vis[i] = 1; + dfs1(i); + } + + int cnt = 0; + vis.reset(); + while(!st.empty()) { + int n = st.top(); st.pop(); + if(vis[n]) continue; + vis[n] = 1; + dfs2(n, ++cnt); + } + + for(int i=1;i<=N;i++) for(int j:g[i]) if(num[i] != num[j]) { + deg[num[i]]++; + v[num[j]].push_back(num[i]); + } + + queue q; + for(int i=1;i<=cnt;i++) if(!deg[i]) { + q.push(i); + dp[i] = 1; + } + + while(!q.empty()) { + int n = q.front(); q.pop(); + for(int i:v[n]) { + if(!--deg[i]) q.push(i); + dp[i] = max(dp[i], dp[n] + 1); + } + } + + vector ans; + for(int i=1;i<=N;i++) if(dp[num[i]] == cnt) ans.push_back(i); + + cout<