[알고리즘 - 문제] BFS

BFS는 모든 가중치가 1일때, 최단거리를 구하는 알고리즘
가중치가 1이 아니면 Dijkstra 알고리즘

  1. 조건
  • 최소 비용 문제이어야 한다
  • 간선의 가중치가 1이어야 한다
  • 정점과 간선의 개수가 적어야한다 -> O(V+E)
  1. 숨바꼭질 문제
  • 최소 비용 : 동생을 찾는 가장 빠른시간
  • 가중치 : 1
  • 정점과 간선의 개수 : 10만 + 10만 = 20만
  • 최종 답 : 최소 비용
from collections import deque

MAX = 200001
n, m = map(int, input().split())

checked = [0 for _ in range(MAX)]
dist = [0 for _ in range(MAX)]
q = deque()

q.append(n)
checked[n] = True

while q:
    curr = q.popleft()
    for next in [curr+1, curr-1, curr*2]:
        if 0 <= next < MAX and checked[next] == False:
            checked[next] = True
            dist[next] = dist[curr] + 1
            q.append(next)
print(dist[m])
  1. 숨바꼭질 문제2
  • 최소 비용 : 동생을 찾는 가장 빠른시간
  • 가중치 : 1
  • 정점과 간선의 개수 : 10만 + 10만 = 20만
  • 최종 답 : 최소 비용, 최소 경로
from collections import deque

MAX = 200001
n, m = map(int, input().split())

checked = [0]*MAX
dist = [0]*MAX
f = [0]*MAX
q = deque()

q.append(n)
checked[n] = True


# dist[next] 가 최소인 놈
while q:
    curr = q.popleft()
    for next in [curr+1, curr-1, curr*2]:
        if 0 <= next < MAX and checked[next] == False:
            q.append(next)
            checked[next] = True
            dist[next] = dist[curr] + 1
            f[next] = curr


history = []
i = m
history.append(str(m))
while i != n:
    i = f[i]
    history.append(str(i))
print(dist[m])
print(" ".join(reversed(history)))

기억할 것)

  • libary 이름 외웟!!!
  • bfs는 queue-FIFO, dfs는 stack-LIFO
  • checked, dist, queue
  • print(" ".join(reversed(history)))

좋은 웹페이지 즐겨찾기