BOJ 2252 (์ค„ ์„ธ์šฐ๊ธฐ)
ย - Last update: 2023-06-05

ํ’€์ด๋ฅผ ๋ณด๋ฉด ๋งค์šฐ ๋‹น์—ฐํ•˜์ง€๋งŒ, ๊ทธ๋ž˜ํ”„์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ํ™•์‹คํžˆ ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ์•„์ด๋””์–ด ๋ฐœ์ƒ์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค. ์–ด๋–ค ์ˆœ์„œ๋ฅผ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์„ edge ์—ฐ๊ฒฐ๋กœ ๋ณผ ์ˆ˜ ์žˆ๊ณ , ์ด๋Ÿฐ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๊ฒŒ๋” ํ•ด๋‘” ๋‹ค์Œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ dfs๋กœ ๋ฐฉ๋ฌธํ•ด ๋‚˜๊ฐ€๋ฉด, ์ œ์ผ ๋์— ๋„๋‹ฌํ•˜๋Š” ๋…€์„์ด leaf๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ , ๊ทธ ๋‹ค์Œ ๋…€์„์€ leaf-1์ด ๋˜๊ณ , ์ด๊ฒƒ์ด ๋ฐ˜๋ณต๋˜๋ฉด ๊ฒฐ๊ตญ root๊นŒ์ง€ ๋ฐ˜๋ณต๋œ๋‹ค. root๋Š” ์ œ์ผ ๋’ค์— ์žˆ๋Š” ๋…€์„์— ๋Œ€์‘๋˜๊ณ , leaf๋Š” ์ œ์ผ ์•ž์— ์žˆ๋Š” ๋…€์„์— ๋Œ€์‘๋˜๋ฏ€๋กœ, ์ด ์ˆœ์„œ๋Œ€๋กœ dfs๋กœ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ๋๋‚˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

์œ„์ƒ ์ •๋ ฌ, ์ฆ‰ topological sort๋Š” ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋ฉฐ, ๋งŒ์•ฝ์— dfs๊ฐ€ ์•„๋‹Œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด, dfsํ•จ์ˆ˜์—์„œ ๋‚˜์˜ฌ ๋•Œ ์ˆœ์„œ๋ฅผ ๊ธฐ๋กํ•œ ๋‹ค์Œ์— ํ•ด๋‹น ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ์„ ํ•˜๋ฉด ๋˜๊ฒ ๋‹ค.

#include <bits/stdc++.h>
using namespace std;
int visited[32001];
vector<int> edges[100001];
void dfs(int v) {
if (visited[v]) return;
visited[v] = 1;
for(int t: edges[v]) {
dfs(t);
}
printf("%d ", v);
}
int main() {
int N, M; scanf("%d %d", &N, &M);
for(int i = 0; i < M; ++i) {
int a, b;
scanf("%d %d", &a, &b);
edges[b].push_back(a);
}
for(int i = 1; i <= N; ++i) {
dfs(i);
}
printf("\n");
return 0;
}
๐Ÿท๏ธ ์ฃผ์ œ ๋ชฉ๋ก: