장점
단점
최단 거리를 구해야 하는 경우
일반적인 bfs로 구현이 가능하다. 큐를 활용해 단개별 정점들을 탐색해 주면 된다.
최단 거리를 구하지만, 조건이 여러개 존재하는 경우 ( 방문한 지점도 다시 방문가능 등)
일반적인 방법이 아니기 떄문에, dfs알고리즘을 약간 변형해야한다. 기존에 방문했던 정점이라도, 최소 비용으로 업데이트가 가능하다면 큐에 새로 추가한다.
관련 문제 - https://www.acmicpc.net/problem/9466
bfs(G, v)
Q ← createQueue()
G.visited[v] ← TRUE
enqueue(Q, v)
visit(v)
while (not isEmpty(Q)) do
v ← dequeue(Q)
for all w ∈ (v의 인접 정점) do
if w가 방문되지 않았으면 then
enqueue(Q, w.vertex)
G.visited[w.vertex] ← TRUE
visit(w.vertex)
end bfs()
from collections import deque
def bfs(graph, v, visited, pred):
global result
q = deque([v])
# 현재 정점을 방문 처리
visited[v] = True
# 큐가 빌 때까지 반복
while q:
v = q.popleft()
result.append(v)
# 현재 정점의 인접 정점 모드 큐에 삽입, 방문
for i in range(7):
if graph[v][i] and (not visited[i]):
q.append(i)
visited[i] = True
from collections import deque
# n: 정점의 개수, m: 간선의 개수, v:탐색을 시작할 정점의 번호
n, m, v = map(int,input().split())
graph = [[] for _ in range(n+1)]
for i in range(m):
a,b = map(int,input().split())
graph[a].append(b)
graph[b].append(a)
graph[a].sort()
graph[b].sort()
def bfs(graph, start, visited):
# 큐(Queue) 구현을 위해 deque 라이브러리 사용
queue = deque([start])
# 현재 노드를 방문 처리
visited[start] = True
# 큐가 빌 때까지 반복
while queue:
# 큐에서 하나의 원소를 뽑아 출력
v = queue.popleft()
print(v, end=' ')
# 해당 원소와 연결된, 아직 방문하지 않은 원소들을 큐에 삽입
for k in graph[v]:
if not visited[k]:
queue.append(k)
visited[k] = True
visited = [False] * (n+1)
bfs(graph, v, visited)