๐[1260] DFS์ BFS
๋ฌธ์
https://www.acmicpc.net/problem/1260
์์ ์ ๋ ฅ 1
4 5 1
1 2
1 3
1 4
2 4
3 4
์์ ์ถ๋ ฅ 1
1 2 4 3
1 2 3 4
์์ ์ ๋ ฅ 2
5 5 3
5 4
5 2
1 2
3 4
3 1
์์ ์ถ๋ ฅ 2
3 1 2 5 4
3 1 4 2 5
๋ต์
import sys
from collections import deque
# sys.setrecursionlimit(10000)
def dfs(v, visited):
if v in visited:
return
visited.append(v)
print(v, end=' ')
for i in sorted(graph[v]):
if i not in visited:
dfs(i, visited)
def bfs(v, visited):
queue = deque([v])
visited.append(v)
while queue:
v = queue.popleft()
print(v, end=' ')
for i in sorted(graph[v]):
if i not in visited:
visited.append(i)
queue.append(i)
input = sys.stdin.readline
n, m, v = map(int, input().split())
graph = [[] for _ in range(n + 1)]
visited = []
# ์ธ์ ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ
for _ in range(m):
a, b = map(int, input().split())
graph[a].append(b)
graph[b].append(a)
dfs(v, visited)
visited = []
print()
bfs(v, visited)
ํ์ด
DFS์ ์ดํด
๋จผ์ DFS์ ๋ํ ์ดํด๊ฐ ํ์ํจ.
๊ฐ์ฅ ๊น์ด ๋ด๋ ค๊ฐ ๋ค์, ๊ฐ ๊ธธ์ด ์์ผ๋ฉด ์ด์ ๋ถ๊ธฐ๋ก ๋์์ ์ ๋ฆฌํ๋ก ๋์ด๊ฐ๋ ๋ฐฉ์์ ํ์.
def dfs(v, visited):
if v in visited:
return
visited.append(v)
print(v, end=' ')
for i in sorted(graph[v]):
if i not in visited:
dfs(i, visited)
visited
๋ผ๋ ๋ฐฉ๋ฌธ ๊ธฐ๋ก์ ๋จ๊ธฐ๋ ๋ฆฌ์คํธ๊ฐ ํ์ํ๊ณ , ํ์ฌ ํ์ ์ค์ธ ๋
ธ๋์ธ v(vertex)
, ๊ทธ๋ฆฌ๊ณ v์ ๋ฆฌํ ๋
ธ๋์ ํด๋นํ๋ graph
๊ฐ ํ์ํจ.
์ ์ฝ๋๋ฅผ ์๋์ฒ๋ผ ๋ฐ๊ฟ ์๋ ์์.
def dfs(v, visited, graph):
if v in visited:
return
visited.append(v)
print(v, end=' ')
for i in sorted(graph[v]):
if i not in visited:
dfs(i, visited, graph)
๊ฒฐ๊ตญ ๊ฐ์ ๋์์ธ๋ฐ, graph
๋ง ์ธ์๋ก ์ฃผ๋ ๋ง๋์ ์ฐจ์ด.
๋์ ์์๋ ์๋์ ๊ฐ์.
- v๋ฅผ ๊ธฐ์ค์ผ๋ก ํ์ ์์
- v๊ฐ ๋ฐฉ๋ฌธ๊ธฐ๋ก(visited)์ ์์ผ๋ฉด return
- ์์ผ๋ฉด ๋ฐฉ๋ฌธ๊ธฐ๋ก์ ์ถ๊ฐํ ํ ํ์ฌ ํ์ ์ค์ธ ๋ ธ๋ ์ถ๋ ฅ
- ๋ฌธ์ ์์
๋จ, ๋ฐฉ๋ฌธํ ์ ์๋ ์ ์ ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ์๋ ์ ์ ๋ฒํธ๊ฐ ์์ ๊ฒ์ ๋จผ์ ๋ฐฉ๋ฌธํ๊ณ
๋ผ๋ ์กฐ๊ฑด์ด ์๊ธฐ ๋๋ฌธ์ v์ ๋ํ ๋ฆฌํ ๋ ธ๋์ธgraph[v]
๋ฅผ ์ ๋ ฌ - ์ดํ graph๋ฅผ ์ํํ๋ฉฐ ๋ฆฌํ ๋ ธ๋ ๋ณ๋ก ๋ฐฉ๋ฌธ ๊ธฐ๋ก์ ์๋์ง ํ์ธ
- ๋ฐฉ๋ฌธ ๊ธฐ๋ก์ ์์ผ๋ฉด ํ์์ ๋ค์ ํด์ผํ๋๊น ์ฌ๊ท(DFS ์์)
BFS์ ์ดํด
BFS๋ ๋์ด ์ฐ์ ํ์์ผ๋ก, ๋ฐ๋ก ์๋ ๋ฆฌํ์ ์ ๋ถ๋ฅผ ํ์ํ๊ณ ๋ค์ ๋ฆฌํ๋ก ๋์ด๊ฐ๋ ํ์ ๋ฐฉ๋ฒ.
์ฆ, ์ต๋ํ ๋๊ฒ ์ด๋ํ ๋ค์ ๋ ์ด์ ์ด๋ํ ์ ์์ ๋ ๋ค์์ผ๋ก ๋์ด๊ฐ.
def bfs(v, visited):
queue = deque([v])
visited.append(v)
while queue:
node = queue.popleft()
print(node, end=' ')
for i in sorted(graph[node]):
if i not in visited:
visited.append(i)
queue.append(i)
DFS์ ๋ง์ฐฌ๊ฐ์ง๋ก graph
๋ฅผ ์ธ์๋ก ์ค ์๋ ์์.
BFS
์ ํฐ ํน์ง ์ค ํ๋๋ Queue
๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ!
queue๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด python์ deque
๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํจ.
queue = deque([v])
deque([v])
๋ฅผ ํจ์ผ๋ก์จ, ํ์ ์ค์ธ ๋ ธ๋๋ฅผ queue์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ ์ฅ- ํ๋ฅผ ์ ์ํ๊ณ ,
queue.append(v)
๋ก ํ ์๋ ์์.
์ดํ, ํ์ฌ ํ์ ์ค์ธ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ ๊ธฐ๋ก์ ์ถ๊ฐํ๊ณ , BFS์ ๋ณธ๊ฒฉ์ ์ธ ํ์ ์์.
DFS์ ๋ง์ฐฌ๊ฐ์ง์ ์ด์ ๋ก sort๋ฅผ ํด์ฃผ๊ณ ๋ฆฌํ ๋ ธ๋ ํ์.
queue.append(i)
๋ queue์ ์ธ์๋ฅผ ์ถ๊ฐํจ์ผ๋ก์จ ๋ค์ ํ์์ ์งํํ๊ธฐ ์ํ ๋ฐฉ๋ฒ.
์ด๊ฒ ์ฌ์ค์ BFS์ ํต์ฌ์ผ ์๋..?
BFS์ ๋์ ์์๋ ๋ค์๊ณผ ๊ฐ์.
- ํ ์ ์
- ํ์ v ์ถ๊ฐ
- v๋ฅผ ๋ฐฉ๋ฌธ๊ธฐ๋ก์ ์ถ๊ฐ
- ํ๊ฐ ์กด์ฌํ์ง ์์ ๋๊น์ง ๋ฐ๋ณต
- ํ์ ๊ฐ์ฅ ์ฒซ ๋ฒ์งธ์ ์์นํ ๊ฐ์ popํ์ฌ node์ ์ ์ฅ (ํ์ํ๋ ค๋ ๋ ธ๋)
- ์ถ๋ ฅํ๊ณ
- node์ ๋ํ ๋ฆฌํ ๋ ธ๋ ํ์ ์์
- ๋ฆฌํ ๋ ธ๋ ์ํํ๋ฉด์ ๋ฐฉ๋ฌธ๊ธฐ๋ก์ ์์ผ๋ฉด?
- ๋ฐฉ๋ฌธ๊ธฐ๋ก์ ์ถ๊ฐํ๊ณ
- ๋ค์ ๊ทธ ๋ ธ๋๋ฅผ ํ์ ์ ์ฅ
์ธ์ ๋ฆฌ์คํธ์ ์ดํด
์ธ์ ๋ฆฌ์คํธ
๋ ๋
ธ๋(node)์ ์๊ฐ ๋ง๊ณ , ๊ฐ์ (edge)์ ๊ฐ์๊ฐ ์ ์ ๋ ์ ์ฉํจ.
๋ฌด๋ฐฉํฅ ๊ทธ๋ํ(์๋ฐฉํฅ ๊ทธ๋ํ)์ผ ๊ฒฝ์ฐ ๋ณดํต ์๋์ ๊ฐ์ด ๊ตฌํํจ.
# ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ ์์
1 โ 2
| /
3
node, edge = map(int, input().split())
graph = [[] for _ in range(node)]
for _ in range(edge):
start_node, end_node = map(int, input().split())
graph[start_node].append(end_node)
graph[end_node].append(start_node)
๊ทธ๋ผ ์ธ์ ํ๋ ฌ
์ ๋ฌด์์ผ๊น?
์ธ์ ํ๋ ฌ์ ๋ ธ๋์ ์์ ๋นํด ๊ฐ์ ์ ์๊ฐ ๋ง์ ๋ ์ ์ฉํจ.
2์ฐจ์ ๋ฐฐ์ด๋ก ๊ทธ๋ํ๋ฅผ ํํํ๋ ๋ฐฉ๋ฒ์ผ๋ก, ๋
ธ๋ i์์ j๋ก ๊ฐ๋ ๊ฐ์ ์ด ์์ผ๋ฉด 1
, ์์ผ๋ฉด 0
์ผ๋ก ํจ.
๋ฌด๋ฐฉํฅ ๊ทธ๋ํ(์๋ฐฉํฅ ๊ทธ๋ํ)์ผ ๊ฒฝ์ฐ ๋ณดํต ์๋์ ๊ฐ์ด ๊ตฌํํจ.
node, edge = map(int, input().split())
graph = [[] for j in range(node) for i in range(node)]
for _ in range(edge):
start_node, end_node = map(int, input().split())
graph[start_node][end_node] = 1
graph[end_node][start_node] = 1
# ์ธ์ ํ๋ ฌ์์ ngod m์ด์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง ๊ฒฝ์ฐ
row, column, edge = map(int, input().split())
graph = [[] for j in range(column) for i in range(row)]
for _ in range(edge):
start_node, end_node = map(int, input().split())
graph[start_node][end_node] = 1
graph[end_node][start_node] = 1
์์์๋ ์ ๋ถ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ
์์๋ง์ ๊ฐ์ ํ์ ๋ ๊ฒฐ๊ณผ์.
๊ทธ๋ผ ๋ฐฉํฅ์ด ์๋ ๊ทธ๋ํ์์๋?
์ธ์ ํ๋ ฌ
๋จผ์ ๋ณด์.
์๋ฅผ ๋ค์ด i โ j๋ก ๊ฐ๋ ๊ฐ์ ์ด ์์ผ๋ฉด 1
๋ก ํ๊ณ , ๋ฌด๋ฐฉํฅ๊ณผ ๋ค๋ฅด๊ฒ matrix[a][b] = 1๋ง ํด์ฃผ๊ณ , matrix[b][a]๋ ๊ฐ์ ์ฃผ์ง ์๋๋ค.
์ฆ, matrix[1][2] = 1์ 1 โ 2 ๊ฐ ์กด์ฌํ๋ค๋ ์๋ฏธ์.
matrix = [[0] * (n+1) for _ in range(n+1)]
edges = [(1,2), (1,3), (2,3)]
for a, b in edges:
matrix[a][b] = 1
for row in matrix:
print(row)
์ธ์ ๋ฆฌ์คํธ
๋ ๊ฐ ๋
ธ๋์์ ๋๊ฐ๋ ๊ฐ์ ๋ง ๊ธฐ๋กํ๋ค.
1: [2, 3]
2: [3]
3: []
n = 3
graph = [[] for _ in range(n+1)]
edges = [(1,2), (1,3), (2,3)]
for a, b in edges:
graph[a].append(b) # ๋ฐฉํฅ ๊ทธ๋ํ๋๊น ํ์ชฝ๋ง ์ ์ฅ
๊ฒฐ๊ตญ ๊ทธ๋ํ์ ๋ฐฉํฅ์ฑ ์ฐจ์ด๋ ๋ค์๊ณผ ๊ฐ์.
- ์ธ์ ํ๋ ฌ
graph[a][b] = 1
,graph[b][a] = 1
โ ์ด๊ฒ ๋ฌด๋ฐฉํฅ์ผ ๋.graph[a][b] = 1
โ ์ด๊ฒ ๋ฐฉํฅ ๊ทธ๋ํ์ผ ๋. (๋ฐ๋ ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๊ฐ์ ์ฃผ๋ ๋ก์ง ์ ๊ฑฐ)
- ์ธ์ ๋ฆฌ์คํธ
graph[a].append(b)
,graph[b].append(a)
โ ์ด๊ฒ ๋ฌด๋ฐฉํฅ์ผ ๋.graph[a].append(b)
โ ์ด๊ฒ ๋ฐฉํฅ ๊ทธ๋ํ ์ผ ๋. (๋ฐ๋ ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๊ฐ์ ์ฃผ๋ ๋ก์ง ์ ๊ฑฐ)
ํ๊ณ
- DFS์ ๋์ ์๋ฆฌ ์ดํดํ๊ธฐ
- BFS์ ๋์ ์๋ฆฌ ์ดํดํ๊ธฐ
- ์ธ์ ๋ฆฌ์คํธ๋ ์ด๋ป๊ฒ ๊ตฌํํ์ง?
- ์ธ์ ๋ฆฌ์คํธ์ ์ธ์ ํ๋ ฌ์ ์ฐจ์ด?
- ๊ทธ๋ํ์ ๋ฐฉํฅ์ฑ ์ ๋ฌด์ ๋ฐ๋ฅธ ์ธ์ ํ๋ ฌ๊ณผ ์ธ์ ๋ฆฌ์คํธ?
๋๊ธ๋จ๊ธฐ๊ธฐ