Recent Posts
Recent Comments
라떼는말이야
너비 우선 탐색(BFS, Breadth First Search) 파이썬 구현 본문
반응형
BFS (너비 우선 탐색, Breadth First Search)
- 최단 거리, 최소 비용과 같이 최솟값과 관련된 문제 해결에 사용.
- 이때 그래프의 가중치(시간, 비용, 거리 등)가 1이어야만 한다.
- 모든 경로에 대한 동시 탐색 가능.
- 최대 경로를 몰라도 사용 가능 → 최단 거리, 최소 비용 등을 구하기 좋다.
- 큐(Queue) 사용. → FIFO 구조
절차
- 저장된 정점 중 첫 번째 정점을 선택하여 저장된 정점에서 제거
- 제거한 정점에서 해야 할 작업 진행
- 제거한 정점과 연결된 정점 중 방문하지 않은 모든 정점 저장(2, 3번은 순서가 바뀌어도 됨)
- 저장된 정점에 모든 노드가 제거될 때까지 1~3번 과정 반복
1번 정점 탐색 시작
시작 정점을 저장한 뒤 방문 표시(회색 처리).
첫 번째 단계로 저장된 첫 번째 정점인 1을 제거함
1번과 연결되고 아직 방문하지 않은 모든 정점(2, 3, 4)을 저장.
방문하지 않은 정점을 저장할 때 반드시 방문했다는 표시를 남겨줌.
첫 번째 과정으로 돌아가서 저장된 정점 중 가장 첫 번째 정점인 2번 정점 제거.
2번 정점과 연결되고, 아직 방문하지 않은 모든 정점(5)을 저장.
2번 정점의 모든 작업이 완료되었으므로 첫 번째 과정으로 돌아감.
저장된 정점 중 가장 첫 번째 정점이 3이므로 3번 정점을 제거
3번과 연결되고 아직 방문하지 않은 정점(6)을 저장.
3번 정점의 작업이 완료되었으므로 4, 5번 정점 작업을 해야 하지만 두 정점과 연결된 모든 정점이 모두 방문한 상태이므로 넘어간다.
6번 정점과 연결되고, 아직 방문하지 않은 정점(7)을 저장.
첫 번째 과정으로 돌아가 7번 정점을 선택하고 저장된 정점에서 삭제.
7번 정점까지 방문했다면 그래프의 모든 정점을 방문했으므로 BFS 종료.
구현
graph = [[], [2, 3, 4], [5], [6], [6], [6], [7], []]
def bfs(start):
chk = [False] * 1010
q = []
q.append(start)
chk[start] = True
while len(q):
cur = q[0]
q = q[1:] # q.pop()
print(cur)
for i in graph[cur]:
if chk[i] is False:
chk[i] = True
q.append(i)
bfs(1)
graph을 이중 리스트(중첩 리스트)로 표현.
예를 들어 graph[1]에는 1번 노드와 연결된 노드(2, 3, 4번 노드)들을 저장한다.
반응형
'알고리즘' 카테고리의 다른 글
[solved.ac 실버3] 14426_접두사 찾기 (파이썬, 문자열) (0) | 2022.06.29 |
---|---|
[Python] 리스트의 특정 원소 모두 제거하기 (6) | 2021.08.22 |
[Python] 계수 정렬 (Count sort) (2) | 2021.08.21 |
[Python] Quick sort. 파이썬에서 간단히 퀵 정렬 구현 (3) | 2021.08.21 |
[프로그래머스 lv2] 괄호 변환 (파이썬) (0) | 2021.07.23 |
깊이 우선 탐색(DFS, Depth First Search) 파이썬 구현 (0) | 2021.06.26 |
투포인터(two pointer) 파이썬 구현 (0) | 2021.05.23 |
Comments