Skip to content

Commit 1973135

Browse files
committed
[Silver II] Title: 알고리즘 수업 - 깊이 우선 탐색 2, Time: 596 ms, Memory: 352928 KB -BaekjoonHub
1 parent 893f9a2 commit 1973135

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# [Silver II] 알고리즘 수업 - 깊이 우선 탐색 2 - 24480
2+
3+
[문제 링크](https://www.acmicpc.net/problem/24480)
4+
5+
### 성능 요약
6+
7+
메모리: 352928 KB, 시간: 596 ms
8+
9+
### 분류
10+
11+
깊이 우선 탐색, 그래프 이론, 그래프 탐색, 정렬
12+
13+
### 제출 일자
14+
15+
2025년 3월 20일 22:34:02
16+
17+
### 문제 설명
18+
19+
<p>오늘도 서준이는 깊이 우선 탐색(DFS) 수업 조교를 하고 있다. 아빠가 수업한 내용을 학생들이 잘 이해했는지 문제를 통해서 확인해보자.</p>
20+
21+
<p><em>N</em>개의 정점과 <em>M</em>개의 간선으로 구성된 무방향 그래프(undirected graph)가 주어진다. 정점 번호는 1번부터 <em>N</em>번이고 모든 간선의 가중치는 1이다. 정점 <i>R</i>에서 시작하여 깊이 우선 탐색으로 노드를 방문할 경우 노드의 방문 순서를 출력하자.</p>
22+
23+
<p>깊이 우선 탐색 의사 코드는 다음과 같다. 인접 정점은 <b>내림차순</b>으로 방문한다.</p>
24+
25+
<pre>dfs(V, E, R) { # V : 정점 집합, E : 간선 집합, R : 시작 정점
26+
visited[R] <- YES; # 시작 정점 R을 방문 했다고 표시한다.
27+
for each x ∈ E(R) # E(R) : 정점 R의 인접 정점 집합.(정점 번호를 <strong>내림차순</strong>으로 방문한다)
28+
if (visited[x] = NO) then dfs(V, E, x);
29+
}</pre>
30+
31+
### 입력
32+
33+
<p>첫째 줄에 정점의 수 <em>N</em> (5 ≤ <em>N</em> ≤ 100,000), 간선의 수 <em>M</em> (1 ≤ <em>M</em> ≤ 200,000), 시작 정점 <em>R</em> (1 ≤ <em>R</em> ≤ <em>N</em>)이 주어진다.</p>
34+
35+
<p>다음 <em>M</em>개 줄에 간선 정보 <code><em>u</em> <em>v</em></code>가 주어지며 정점 <em>u</em>와 정점 <em>v</em>의 가중치 1인 양방향 간선을 나타낸다. (1 ≤ <em>u</em> < <em>v</em> ≤ <em>N</em>, <em>u</em> ≠ <em>v</em>) 모든 간선의 (<em>u</em>, <em>v</em>) 쌍의 값은 서로 다르다.</p>
36+
37+
### 출력
38+
39+
<p>첫째 줄부터 <em>N</em>개의 줄에 정수를 한 개씩 출력한다. <em>i</em>번째 줄에는 정점 <em>i</em>의 방문 순서를 출력한다. 시작 정점의 방문 순서는 1이다. 시작 정점에서 방문할 수 없는 경우 0을 출력한다.</p>
40+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import sys
2+
sys.setrecursionlimit(10 ** 5)
3+
4+
def dfs(start_node):
5+
global cnt
6+
visited[start_node] = cnt
7+
graph[start_node].sort(reverse = True)
8+
for i in graph[start_node]:
9+
if visited[i] == 0:
10+
cnt += 1
11+
dfs(i)
12+
13+
n,m,r = map(int,input().split())
14+
15+
graph = [[] for _ in range(n+1)]
16+
visited = [0]*(n+1)
17+
cnt = 1
18+
for i in range(m):
19+
a,b = map(int,input().split())
20+
21+
graph[a].append(b)
22+
graph[b].append(a)
23+
24+
dfs(r)
25+
for i in range(1, n+1):
26+
print(visited[i])

0 commit comments

Comments
 (0)