[DFS/BFS] 탐색 알고리즘 DFS/BFS

17317 단어 BFS알고리즘DFSBFS

그래프의 기본 구조

그래프는 노드(Node)와 간선(Edge)로 표현된다. 그래프 탐색이란, 하나의 노드를 시작으로 다수의 노드를 방문하는 것을 말한다. 또한 두 노드가 간선으로 연결되어 있다면, '두 노드는 인접하다 (Adjacent)' 라고 표현한다.


그래프의 표현 방식

1) 인접 행렬(Adjacency Matrix) : 2차원 배열로 그래프의 연결 관계를 표현하는 방식
파이썬에서는 인접 행렬 방식을 2차원 리스트로 구현할 수 있다.

INF = 999999999 # 무한의 비용 선언

# 2차원 리스트를 이용해 인접 행렬 표현
graph = [
    [0, 7, 5],
    [7, 0, INF],
    [5, INF, 0]
]

print(graph)

실행 결과
[[0, 7, 5], [7, 0, 999999999], [5, 999999999, 0]]

2) 인접 리스트(Adjacency List) : 리스트로 그래프의 연결 관계를 표현하는 방식
파이썬으로 인접 리스트를 이용해 그래프를 표현하고자 할 때에도 단순히 2차원 리스트를 이용하면 된다.

# 행(Row)이 3개인 2차원 리스트로 인접 리스트 표현
graph = [[] for _ in range(3)]

# 노드 0에 연결된 노드 정보 저장 (노드, 거리)
graph[0].append((1, 7))
graph[0].append((2, 5))

# 노드 1에 연결된 노드 정보 저장 (노드, 거리)
graph[1].append((0, 7))

# 노드 2에 연결된 노드 정보 저장 (노드, 거리)
graph[2].append((0, 5))

print(graph)

실행 결과
[[(1, 7), (2, 5)], [(0, 7)], [(0, 5)]]


※ 인접 행렬 vs 인접 리스트
메모리속도
인접 행렬낭비빠름
인접 리스트효율적느림