Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
Tags
- 해시함수
- 힙
- 코테준비
- 선택정렬
- 코테
- collections.sort
- LinkedList
- 프로그래머스
- 스택
- 거품정렬
- 15552번
- 코딩테스트
- 삽입정렬
- 백준
- divide and conquer
- 팀정렬
- 큐
- 트라이
- MSA
- 분할정복
- 우선순위 큐
- 이진트리탐색
- 스터디
- heap
- 퀵정렬
- stack
- Timsort
- 파싱
- 자료구조
- 연결리스트
Archives
- Today
- Total
Little bIT awesome
[week9] 벨만-포드 알고리즘 본문
시작 노드 고정하고 반복 돌면서 최단 거리 갱신
전체 노드 수 - 1 만큼 반복하면서 최단 거리 수정
(전체 노드 수 - 1) 만큼 반복하는 이유
- 노드와 노드 사이의 최대 간선의 수는 최대 (전체 노드 수 - 1) 개임
- 일단 반복을 돌았을 때, 거리가 갱신됐다는 것은 경로에 간선의 개수가 하나 늘었다는 것을 의미
-> 최단 거리의 간선의 수가 전체 노드 수 - 1보다 높으면 음의 사이클을 돌고 있다는 것
- 음의 사이클을 돌면 그냥 그 노드까지이 최단 거리를 구할 수 없음 (무한대로 수렴하기 때문에)
코드 해석
간선 edge가 있을 때
edge.v = 간선의 시작
edge.w = 간선의 목적지
edge.cost = 간선의 가중치
dist[x] = 시작점부터 x까지의 거리
// 전체 노드 수 - 1 만큼 반복
for (int i = 0; i < n - 1; i++) {
// 간선의 개수만큼 반복
for (int j = 0; j < m; j++) {
Edge edge = graph.get(j);
// 목적지까지의 거리가 시작점부터 간선의 시작까지의 거리에 간선의 가중치를 더한것보다 크면,
// 이 간선을 포함하는 경로로 갱신
// 그러면 경로에 포함되는 간선의 길이가 늘어나는 것!
// -> 이 경로들의 최댓값이 노드 수 - 1이기 때문에 노드 수 - 1만큼 반복하는 것
if (dist[edge.v] != Integer.MAX_VALUE && dist[edge.w] > dist[edge.v] + edge.cost) {
dist[edge.w] = dist[edge.v] + edge.cost;
}
}
}
'코딩테스트 > 알고리즘 정리' 카테고리의 다른 글
[Week10] MST 알고리즘(1) - Kruskal's Algorithm (0) | 2024.05.26 |
---|---|
[Week10] Union Find 알고리즘 (java) (0) | 2024.05.26 |
[week9] 다익스트라 알고리즘 (Dijkstra Algorithm) (0) | 2024.04.30 |
[week8] 그래프, 트리의 차이점 (0) | 2024.04.09 |
[week7] 최장 증가 부분 수열(LIS) 알고리즘 (0) | 2024.04.03 |