"BFS는 모든 도로를 한 걸음으로 쳐. 그런데 진짜 지도에는 짧은 골목도 있고 긴 고속도로도 있잖아. 간선마다 비용이 달라지는 순간 '도로를 가장 적게 지나는 길'이 '가장 짧은 여정'을 뜻하지 않게 돼."
간선이 숫자를 짊어져
가중 그래프는 간선마다 숫자를 붙여. 거리일 수도, 시간일 수도, 가격이나 용량이나 확률일 수도 있지. 그리고 그 숫자를 어떻게 결합할지는 문제마다 달라. 거리와 비용은 대개 더하지만, 경로의 대역폭은 병목을 봐야 하니 최솟값을 취하고, 확률은 곱하거나 음의 로그로 바꿔 쓰기도 해. "가중치가 있다"가 곧 "전부 더해서 최소를 구한다"는 뜻은 아니야.
왜 이게 BFS를 깨뜨릴까
BFS는 간선 수가 가장 적은 경로를 찾는데, 그건 모든 간선의 비용이 같을 때만 맞는 답이야. 이렇게 그려 봐. A→B는 길이 100짜리 도로 하나고, A→C→D→B는 다 합쳐 6인 짧은 도로 셋이야. BFS는 거쳐 가는 간선 수만 세니까 간선 하나짜리 A→B를 '최단'이라고 선언하고 100만큼 돌아가는 길로 보내 버려. 간선이 가장 적은 경로와 비용이 가장 싼 경로가 갈라진 거지. 가중치를 제대로 다루려면 총비용을 누적하면서 언제나 지금까지 가장 싼 경계 노드를 다음에 펼치는 알고리즘이 필요해. 그게 Dijkstra고, 힙 트랙에서 만든 우선순위 큐 위에 얹혀 있어. '지금 가장 싼 걸 달라'는 바로 그 구조 말이야.
가중 문제의 가문
가중치가 붙으면 고전 문제 한 무리가 통째로 열려. 이 트랙이 그 핵심을 훑어.
- 단일 출발 최단 경로. 한 시작점에서 모든 곳까지 가장 싼 경로를 구해. 가중치가 0 이상이면 Dijkstra, 음수가 섞이면 Bellman-Ford고, 바로 다음 두 꼭지에서 다뤄.
- 연결성. union-find로 '이거 이어져 있나?'에 답하고, 다른 알고리즘의 부품으로도 들어가.
- 최소 신장 트리. 전부를 잇는 가장 싼 방법이야. Kruskal과 Prim이 있고.
- 모든 쌍 최단 경로(Floyd-Warshall). 모든 정점 쌍 사이의 가장 싼 경로인데, 이름은 알아둘 만하고 여기서 구현하진 않아.
하나같이 '가중치가 붙은 네트워크 위에서의 최적화'고, 다 합치면 라우팅과 네트워크 설계, 스케줄링, 클러스터링을 덮어. 실제 시스템에서 아주 큰 덩어리지.