일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 가운데 글자 가져오기 java
- 코드업 1020 자바
- 빅데이터분석기사
- 가운데 글자 가져오기 python
- 청년 Ai Big Data 아카데미
- 코드업 1020 java
- 트리의 지름 자바
- codeup 1020 자바
- 트리의 지름 java
- docker 완전 삭제
- 최단 경로 알고리즘
- 핸즈온 머신러닝
- docker remove
- 청년 AI Big Data 아카데미 13기
- 가운데 글자 가져오기 파이썬
- 나누어 떨어지는 숫자 배열 java
- 프로그래머스 나누어 떨어지는 숫자 배열 자바
- 프로그래머스 가운데 글자 가져오기 파이썬
- docker 삭제
- 가운데 글자 가져오기 자바
- 최소 스패닝 트리 자바
- 최소 스패닝 트리
- m1 docker
- 프로그래머스 가운데 글자 가져오기 python
- 프로그래머스 가운데 글자 가져오기 자바
- 빅분기실기
- 프로그래머스 나누어 떨어지는 숫자 배열 파이썬
- codeup 1020 java
- 나누어 떨어지는 숫자 배열 python
- m1 docker install
- Today
- Total
NineTwo meet you
[알고리즘] 최단 경로 알고리즘 : 다익스트라 (Dijsktra) 본문
다익스트라(Dijsktra)
- 단일 시작점 최단거리 알고리즘
- 너비 우선 탐색(BFS)과 유사한 형태를 가진 알고리즘
- 큐 대신 우선순위 큐(PriorityQueue)를 사용해 최단 거리를 기준으로 정점을 배열해 문제를 해결
- 음수 간선을 포함할 수 없음
동작 과정
- 출발 노드 방문 및 출발 노트 최소 비용 0으로 초기화
- 출발 노드 기준 각 노드별 최소 비용 저장
- 방문하지 않은 노드 중 가장 최소 비용 노드 선택
- 해당 노드를 거쳐 특정 노드로 가는 경우 고려해 최소 비용 갱신
- 3,4 반복
1.
기본 그래프 확인
2.
출발 노드 방문 및 출발 노트 최소 비용 0으로 초기화한다.
출발 노드 0의 최소 비용을 0으로 초기화한다.
3.
출발 노드 기준 각 노드별 최소 비용 저장한다.
출발 노드 0을 기준으로 연결된 노드 1과 노드 2를 최소 비용으로 업데이트하고
우선순위 큐에 노드 인덱스와 간선 가중치의 값인(2, 1)과 (1, 5)를 추가한다.
4.
오름차순으로 정렬된 간선 가중치를 담은 우선순위 큐에서 (3,1)이 poll 된다.
poll 하기 전 우선순위 큐에 담긴 값 : (2, 1), (1, 5)
이때, 노드 3과 연결된 노드 0과 노드 3 중 distance [cur.n] + next.w < distance [next.n] 식에 의해
노드 3을 최소 비용으로 업데이트하고
우선순위 큐에 노드 인덱스와 간선 가중치의 값인(3, 3)를 추가한다.
5.
오름차순으로 정렬된 간선 가중치를 담은 우선순위 큐에서 (3, 3)이 poll 된다.
poll 하기 전 우선순위 큐에 담긴 값 : (3, 3), (1,5)
이때, 노드 3과 연결된 노드 1, 노드 2와 노드 6 중 distance [cur.n] + next.w < distance [next.n] 식에 의해
노드 1, 노드 2와 노드 6을 모두 최소 비용으로 업데이트하고
우선순위 큐에 노드 인덱스와 간선 가중치의 값인 (1,4), (4,8), (6,6)를 추가한다.
6.
오름차순으로 정렬된 간선 가중치를 담은 우선순위 큐에서 (1,4)이 poll 된다.
poll 하기 전 우선순위 큐에 담긴 값 : (1,4), (1,5), (6,6), (4,8)
이때, 노드 1과 연결된 노드 3, 노드 5와 노드 6 중 distance [cur.n] + next.w < distance [next.n] 식에 의해
노드 5를 최소 비용으로 업데이트하고
우선순위 큐에 노드 인덱스와 간선 가중치의 값인 (5,7)를 추가한다.
7.
poll 하기 전 우선순위 큐에 담긴 값 : (1,5), (6,6), (5,7), (4,8)
distance [cur.n] + next.w < distance [next.n] 식에 의해 더 이상 최소 비용으로 업데이트되는 노드가 없어 계속 poll 한다.
static int n; // 정점의 개수
static int m; // 간선의 개수
static ArrayList<path>[] al = new ArrayList[n+1]; // 그래프의 (연결 정점 번호, 간선 가중치)쌍을 담는다.
static int distance[] = new int[n+1]; // 그래프의 거리를 담는 변수
Arrays.fill(distance, Integer.MAX_VALUE);
for(int i = 0; i < n+1; i++) {
al[i] = new ArrayList<>();
}
// 간선 입력 (a, b, c): a -> b 로 가는 가중치 c을 가지는 간선
for(int i = 0; i < m; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
al[a].add(new path(b, c));
}
static void Dijkstra() {
PriorityQueue<path> pq = new PriorityQueue<>(); // 우선순위 큐
pq.offer(new path(start, 0));
distance[start] = 0;
while(!pq.isEmpty()) {
path cur = pq.poll();
for(path next: al[cur.n]) {
if(distance[cur.n] + next.w < distance[next.n]) {
distance[next.n] = distance[cur.n] + next.w;
pq.offer(new path(next.n, distance[next.n]));
}
}
}
}
static class path implements Comparable<path>{
int n; // 정점
int w; // 가중치
path(int n, int w) {
this.n = n;
this.w = w;
}
@Override
public int compareTo(path o) { // 가중치를 오름차순으로 정렬
return this.w - o.w;
}
}
'CS > 알고리즘' 카테고리의 다른 글
[알고리즘] 최소 스패닝 트리 : 프림 (Prim) (0) | 2021.01.24 |
---|---|
[알고리즘] 최소 스패닝 트리 : 크루스칼 (Kruskal) (0) | 2021.01.24 |
[알고리즘] 최단 경로 알고리즘 : 플로이드 와샬 (Floyd Warshall) (0) | 2021.01.20 |
[알고리즘] 최단 경로 알고리즘 : 벨만 포드 (Bellman-Ford) (0) | 2021.01.20 |
[알고리즘] 깊이 우선 탐색 (depth-first search) : DFS (0) | 2021.01.05 |