: 그래프의 시작점에서 다른 지점까지의 최단 거리
이름 | 간선의 가중치 | 시작점 | 도착점 | 시간 복잡도 |
---|---|---|---|---|
BFS | 모두 1 | 한 정점 | 모든 정점 | O (V+E) |
✅ Dijkstra | ≥ 0 | 한 정점 | 모든 정점 | O (E log V) |
→ Dijkstra가 BFS 보다 시간 복잡도가 좋다!
1️⃣ dist 배열 초기화 if(i == S) dist[i] 이면 0 // 시작점에서 시작점까지 거리는 0 else dist[i] 이면 무한 // 시작점 제외 최단거리 측정한 적 없음 자료구조 D에 D(S,0) 추가 // 시작점에서 시작점까지 거리 0 2️⃣ D가 비었나 ? 3️⃣ 자료구조 D에서 가장 작은 d(거리)를 갖는 Info(v,d)를 뽑는다. 4️⃣ 위에서 뽑은 Info(v,d)의 가치 판단 dist[v] < d → v까지의 최단거리보다 d가 크다면 가치가 없는 정보이므로 폐기1️⃣ → 2️⃣ 🔁 6️⃣ → if( D == null )→ clear
O(E log V)
// 1️⃣ dist 배열 초기화, 자료구조 D에 D(S,0) 추가
static void dijkstra(int start){
// TODO : dist 배열 초기화, (S,0)을 D에 저장
// 모든 정점까지에 대한 거리를 무한으로 초기화,
// 문제의 정답으로 가능한 거리의 최댓값보다 큰 값임을 보장해야하므로 최대치 고려해서 Integer.MAX_VALUE
for(int i=1;i<=N;i++) dist[i] = Integer.MAX_VALUE;
// 최소 힙 생성
PriorityQueue<Info> pq = new PriorityQueue<>(Comparator.comparingInt(o -> o.dist));
// 시작점에 대한 정보를 기록에 추가하고, 거리 배열에 갱신
pq.add(new Info(start, 0);
dist[start] = 0;
}
// 2️⃣ queue가 비었나 ?
while(!pq.isEmpty()){
// 3️⃣ 최소의 (v,d) 추출
Info info = pq.poll();
// 4️⃣ 꺼낸 정보가 최신과 다르면, 의미 없이 낡은 정보이므로 폐기
if(dist[info.idx] < info.dist) continue;
// 5️⃣ (v,d)로 새로운 정보 D에 추가
for(Edge e : edges[info.idx]){
if(dist[info.idx] + e.weight >= dist[e.to]) continue;
dist[e.to] = dist[info.idx] + e.weight;
pq.add(new info(e.to,dist[e.to]));
}
}
static void dijkstra(int start){
// 모든 정점까지에 대한 거리 무한으로 초기화
for(int i=1;i<=N;i++) dist[i] = Integer.MAX_VALUE;
// 최소 힙 생성
PrioityQueue<Info> pq = new PriorityQueue<>(Comparator.comparingInt(o ->
// 시작점에 대한 정보를 기록에 추가, 거리배열에 갱신
pq.add(new info(start,0);
dist[start] = 0;
// 거리 정보들이 모두 소진될 때까지 거리 갱신 반복
while(!pq.isEmpty()){
Info info = pq.poll();
if(dist[info.idx] < info.dist) continue;
for(Edge e : edges[info.idx]){
if(dist[info.idx] + e.weight >= dist[e.to]) continue; // 새롭게 찾은 거리 e.to
dist[info.idx] = dist[info.idx] + e.weight;
}
}