문제 링크 - 백준 #2606 바이러스
아래 그림에서, 1과 연결된 노드들이 감염되며, 1번을 통해 감염된 노드의 수를 최종 출력하는 것이다. (1번 제외)
import sys
# DFS
def dfs(v):
# 감염 노드 수 저장 객체
global ift
visit_list[v] = 1
# 링크 모두 탐색
for i in range(L):
if graph[i][0] == v and visit_list[graph[i][1]] == 0:
ift+=1
dfs(graph[i][1])
# 초기화
N = int(sys.stdin.readline())
L = int(sys.stdin.readline())
graph = []
visit_list = [0] * (N+1)
global ift
ift = 0
for _ in range(L):
graph.append(list(map(int, sys.stdin.readline().split())))
# 함수 호출
dfs(1)
print(ift)
4
3
1 4
2 4
2 3
import sys
# DFS
def dfs(v):
global ift
visit_list[v] = 1
# 현재 노드와 연결된 지점 모두 방문
for i in graph[v]:
if visit_list[i] == 0:
ift+=1
dfs(i)
# 초기화
N = int(sys.stdin.readline())
L = int(sys.stdin.readline())
graph = [[] for _ in range(N+1)]
visit_list = [0] * (N+1)
global ift
ift = 0
for _ in range(L):
a, b = list(map(int, sys.stdin.readline().split()))
# graph를 미리 초기화 후, 양방향의 정보를 저장
graph[a].append(b)
graph[b].append(a)
# 함수 호출
dfs(1)
print(ift)
import sys
# DFS
def dfs(v):
global ift
visit_list[v] = 1
# 현재 노드와 연결된 지점 모두 방문
s = [v]
while s:
n = s.pop()
# 현재 노드에 연결된 노드를 차례로 저장하는데,
# 다음 노드를 저장하기 전에 먼저 현재 노드의 자식 노드 저장을 수행
for n_next in graph[n]:
if not visit_list[n_next]:
visit_list[n_next] = 1
s.append(n_next)
ift+=1
# 초기화
N = int(sys.stdin.readline())
L = int(sys.stdin.readline())
graph = [[] for _ in range(N+1)]
visit_list = [0] * (N+1)
global ift
ift = 0
for _ in range(L):
a, b = list(map(int, sys.stdin.readline().split()))
# graph를 미리 초기화 후, 양방향의 정보를 저장
graph[a].append(b)
graph[b].append(a)
# 함수 호출
dfs(1)
print(ift)
현재 노드와 연결된 노드들이 계속해서 저장되는데, 하나의 자식 노드(쌍방향이지만 표현상)가 저장되면 그 자식 노드(n_next)들이 먼저 저장된다. 그렇기 때문에 스택에서 다음으로 처리할 노드는 직전에 추가된 자식 노드가 된다.
import sys
from collections import deque
# bfs
def bfs(v):
global ift
# Deque 사용
q = deque([v])
visit_list[v] = 1
while q:
n = q.popleft()
for n_next in graph[n]:
if not visit_list[n_next]:
visit_list[n_next] = 1
q.append(n_next)
ift += 1
# 초기화
N = int(sys.stdin.readline())
L = int(sys.stdin.readline())
graph = [[] for _ in range(N+1)]
visit_list = [0] * (N+1)
global ift
ift = 0
for _ in range(L):
a, b = list(map(int, sys.stdin.readline().split()))
# graph를 미리 초기화 후, 양방향의 정보를 저장
graph[a].append(b)
graph[b].append(a)
# 함수 호출
bfs(1)
print(ift)
Stack과 비슷한 원리인데, Queue를 사용하여 먼저 들어온 이전 층의 노드를 더 빨리 처리할 수 있게 한다.
- Stack과 Queue의 기능을 모두 가짐
- 계산 속도가 빨라서 사용