ํฐ์คํ ๋ฆฌ ๋ทฐ
๋ฌธ์
๋ฌธ์ ํ์ด
๊ทธ๋ํ์ ๋ํ ์ ๋ณด๊ฐ ์ฃผ์ด์ง ๋, DFS(Depth - First - Search)์ BFS(Breadth - First - Searh)๋ฅผ ํตํด ํ์ํ ๊ฒฝ์ฐ์ ํ์ ์์๋ฅผ ๊ฒฐ๊ณผ๋ก ๋ฐํํ๋ ๋ฌธ์ ์ด๋ค. ๋ฐ๋ผ์ ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด์๋ DFS์ BFS์ ๋ํด ์ดํดํ๊ณ ์์ด์ผ ํ๋ค.
DFS ๊ตฌํ
def dfs(depth, cur_node, visited):
# ์ด๋ฏธ ์์ ์ง์ ์ ๋ฐฉ๋ฌธํ์์ผ๋ฏ๋ก, ํ์ ๊ฒฝ๋ก๋ n - 1
if depth == n - 1:
return
for next_node in range(n):
if graph[cur_node][next_node] and next_node + 1 not in visited:
visited.append(next_node + 1)
dfs(depth + 1, next_node, visited)
return visited
DFS๋ ์ฌ๊ท ํธ์ถ์ด๋ Stack์ผ๋ก ๊ตฌํํ ์ ์๋ค. Stack์ผ๋ก ๊ตฌํํ๋ค๋ฉด, ํน์ ๋ ธ๋์์ ์ ๊ทผ ๊ฐ๋ฅํ ๋ค๋ฅธ ๋ ธ๋๋ค์ ์ญ์์ผ๋ก ์ฝ์ ํ์ฌ์ผ ํ๋ค. ๋ฐ๋ผ์ ์ฌ๊ท ํธ์ถ๋ Stack๊ณผ ๊ฐ์ ์๋ฆฌ ์ด๋ฏ๋ก ์ด๋ฅผ ํตํด DFS๋ฅผ ๊ตฌํํ์๋ค. depth๊ฐ ์๋ฏธํ๋ ๊ฒ์ ๋ฐฉ๋ฌธ ๊ฐ๋ฅํ ๋ ธ๋๋ค์ ๋ค ๋ฐฉ๋ฌธํ์๋์ง ํ์ธํ๊ธฐ ์ํจ์ด๋ค.
๋ํ ์์ด, ์กฐํฉ๊ณผ ๋ฌ๋ฆฌ ์ฌ๊ท ํธ์ถ์ ํ๋๋ผ๋ ๋ฐฑํธ๋ํน์ ํ ํ์๊ฐ ์๊ธฐ์ ํ ๋ฒ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ฅผ ๋ค์ ํด์ ํ ํ์๊ฐ ์๋ค. ๋ง์ฝ ๋ฐฉ๋ฌธ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ผ๊ณ ํ๋ค๋ฉด, ๋ฐฑํธ๋ํน์ ์ํด ์ฌ๊ท ํธ์ถ ํ์ visited.pop()์ด ํ์ํ๋ค.
BFS ๊ตฌํ
def bfs(start):
# ์์ ์ง์ ์ถ๊ฐ์, ๋ฐฉ๋ฌธ ํ์
q = deque([start])
visited = [start + 1]
while q:
cur_node = q.popleft()
for next_node in range(n):
if graph[cur_node][next_node] and next_node + 1 not in visited:
q.append(next_node)
visited.append(next_node + 1)
return visited
BFS๋ DFS์ ๋ฌ๋ฆฌ Queue๋ก ๊ตฌํํ ์ ์๋ค. ๋จผ์ ํ์ํ ๋ ธ๋๋ฅผ ์ฐ์ ์ ์ผ๋ก ์ฒ๋ฆฌํจ์ผ๋ก์จ depth๋ก ๋ป์ด๊ฐ๋ ๊ฒ์ด ๋๋ Breadth๋ก ๋ป์ด ๊ฐ ์ ์๋ค.
์ฝ๋
from collections import deque
def bfs(start):
# ์์ ์ง์ ์ถ๊ฐ์, ๋ฐฉ๋ฌธ ํ์
q = deque([start])
visited = [start + 1]
while q:
cur_node = q.popleft()
for next_node in range(n):
if graph[cur_node][next_node] and next_node + 1 not in visited:
q.append(next_node)
visited.append(next_node + 1)
return visited
def dfs(depth, cur_node, visited):
# ์ด๋ฏธ ์์ ์ง์ ์ ๋ฐฉ๋ฌธํ์์ผ๋ฏ๋ก, ํ์ ๊ฒฝ๋ก๋ n - 1
if depth == n - 1:
return
for next_node in range(n):
if graph[cur_node][next_node] and next_node + 1 not in visited:
visited.append(next_node + 1)
dfs(depth + 1, next_node, visited)
return visited
if __name__ == "__main__":
n, m, v = map(int, input().split())
graph = [[False] * n for _ in range(n)]
for _ in range(m):
i, j = map(int, input().split())
# ๊ทธ๋ํ๋ ์๋ฐฉํฅ์ด๋ฏ๋ก ๋ฐ์ ํ์ฌ ์ฒดํฌํด์ค์ผ ํจ
graph[i - 1][j - 1] = True
graph[j - 1][i - 1] = True
print(*dfs(0, v - 1, [v]))
print(*bfs(v - 1))
'๐จโ๐ป ์ฝ๋ฉํ ์คํธ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค: 13023 ABCDE (0) | 2020.07.20 |
---|---|
๋ฐฑ์ค: 11724 ์ฐ๊ฒฐ ์์์ ๊ฐ์ (0) | 2020.07.20 |
๋ฐฑ์ค: 1248 ๋ง์ถฐ๋ด (0) | 2020.07.19 |
๋ฐฑ์ค: 2529 ๋ถ๋ฑํธ (0) | 2020.07.18 |
๋ฐฑ์ค: 14889 ์คํํธ์ ๋งํฌ (0) | 2020.07.17 |