4 ๋ถ„ ์†Œ์š”

๋ฌธ์ œ

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๋งŒ ์ธ์ž๋กœ ์ฃผ๋ƒ ๋งˆ๋ƒ์˜ ์ฐจ์ด.

๋™์ž‘ ์ˆœ์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Œ.

  1. v๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํƒ์ƒ‰ ์‹œ์ž‘
  2. v๊ฐ€ ๋ฐฉ๋ฌธ๊ธฐ๋ก(visited)์— ์žˆ์œผ๋ฉด return
  3. ์—†์œผ๋ฉด ๋ฐฉ๋ฌธ๊ธฐ๋ก์— ์ถ”๊ฐ€ํ•œ ํ›„ ํ˜„์žฌ ํƒ์ƒ‰ ์ค‘์ธ ๋…ธ๋“œ ์ถœ๋ ฅ
  4. ๋ฌธ์ œ์—์„œ ๋‹จ, ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ์ •์ ์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ์—๋Š” ์ •์  ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ๊ฒƒ์„ ๋จผ์ € ๋ฐฉ๋ฌธํ•˜๊ณ  ๋ผ๋Š” ์กฐ๊ฑด์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— v์— ๋Œ€ํ•œ ๋ฆฌํ”„ ๋…ธ๋“œ์ธ graph[v]๋ฅผ ์ •๋ ฌ
  5. ์ดํ›„ graph๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ๋ฆฌํ”„ ๋…ธ๋“œ ๋ณ„๋กœ ๋ฐฉ๋ฌธ ๊ธฐ๋ก์— ์žˆ๋Š”์ง€ ํ™•์ธ
  6. ๋ฐฉ๋ฌธ ๊ธฐ๋ก์— ์—†์œผ๋ฉด ํƒ์ƒ‰์„ ๋‹ค์‹œ ํ•ด์•ผํ•˜๋‹ˆ๊นŒ ์žฌ๊ท€(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์˜ ๋™์ž‘ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Œ.

  1. ํ ์ •์˜
  2. ํ์— v ์ถ”๊ฐ€
  3. v๋ฅผ ๋ฐฉ๋ฌธ๊ธฐ๋ก์— ์ถ”๊ฐ€
  4. ํ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
  5. ํ์˜ ๊ฐ€์žฅ ์ฒซ ๋ฒˆ์งธ์— ์œ„์น˜ํ•œ ๊ฐ’์„ popํ•˜์—ฌ node์— ์ €์žฅ (ํƒ์ƒ‰ํ•˜๋ ค๋Š” ๋…ธ๋“œ)
  6. ์ถœ๋ ฅํ•˜๊ณ 
  7. node์— ๋Œ€ํ•œ ๋ฆฌํ”„ ๋…ธ๋“œ ํƒ์ƒ‰ ์‹œ์ž‘
  8. ๋ฆฌํ”„ ๋…ธ๋“œ ์ˆœํšŒํ•˜๋ฉด์„œ ๋ฐฉ๋ฌธ๊ธฐ๋ก์— ์—†์œผ๋ฉด?
  9. ๋ฐฉ๋ฌธ๊ธฐ๋ก์— ์ถ”๊ฐ€ํ•˜๊ณ 
  10. ๋‹ค์‹œ ๊ทธ ๋…ธ๋“œ๋ฅผ ํ์— ์ €์žฅ

์ธ์ ‘๋ฆฌ์ŠคํŠธ์˜ ์ดํ•ด

์ธ์ ‘๋ฆฌ์ŠคํŠธ๋Š” ๋…ธ๋“œ(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)   # ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๋‹ˆ๊นŒ ํ•œ์ชฝ๋งŒ ์ €์žฅ

๊ฒฐ๊ตญ ๊ทธ๋ž˜ํ”„์˜ ๋ฐฉํ–ฅ์„ฑ ์ฐจ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Œ.

  1. ์ธ์ ‘ํ–‰๋ ฌ
    • graph[a][b] = 1, graph[b][a] = 1 โ†’ ์ด๊ฒŒ ๋ฌด๋ฐฉํ–ฅ์ผ ๋•Œ.
    • graph[a][b] = 1 โ†’ ์ด๊ฒŒ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์ผ ๋•Œ. (๋ฐ˜๋Œ€ ๊ฐ„์„  ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ’์„ ์ฃผ๋Š” ๋กœ์ง ์ œ๊ฑฐ)
  2. ์ธ์ ‘๋ฆฌ์ŠคํŠธ
    • graph[a].append(b), graph[b].append(a) โ†’ ์ด๊ฒŒ ๋ฌด๋ฐฉํ–ฅ์ผ ๋•Œ.
    • graph[a].append(b) โ†’ ์ด๊ฒŒ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ ์ผ ๋•Œ. (๋ฐ˜๋Œ€ ๊ฐ„์„  ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ’์„ ์ฃผ๋Š” ๋กœ์ง ์ œ๊ฑฐ)

ํšŒ๊ณ 

  • DFS์˜ ๋™์ž‘ ์›๋ฆฌ ์ดํ•ดํ•˜๊ธฐ
  • BFS์˜ ๋™์ž‘ ์›๋ฆฌ ์ดํ•ดํ•˜๊ธฐ
  • ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜์ง€?
  • ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ์™€ ์ธ์ ‘ ํ–‰๋ ฌ์˜ ์ฐจ์ด?
  • ๊ทธ๋ž˜ํ”„์˜ ๋ฐฉํ–ฅ์„ฑ ์œ ๋ฌด์— ๋”ฐ๋ฅธ ์ธ์ ‘ ํ–‰๋ ฌ๊ณผ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ?

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ