반응형
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 | 31 |
Tags
- 나누어 떨어지는 숫자 배열 java
- 청년 Ai Big Data 아카데미
- docker 완전 삭제
- codeup 1020 자바
- 프로그래머스 가운데 글자 가져오기 python
- 빅분기실기
- 핸즈온 머신러닝
- 코드업 1020 자바
- m1 docker
- 최소 스패닝 트리 자바
- docker 삭제
- 가운데 글자 가져오기 python
- 나누어 떨어지는 숫자 배열 python
- m1 docker install
- codeup 1020 java
- 프로그래머스 나누어 떨어지는 숫자 배열 자바
- 프로그래머스 가운데 글자 가져오기 자바
- 최소 스패닝 트리
- 프로그래머스 나누어 떨어지는 숫자 배열 파이썬
- 빅데이터분석기사
- 청년 AI Big Data 아카데미 13기
- 트리의 지름 자바
- 가운데 글자 가져오기 파이썬
- 가운데 글자 가져오기 java
- 코드업 1020 java
- 프로그래머스 가운데 글자 가져오기 파이썬
- 트리의 지름 java
- docker remove
- 최단 경로 알고리즘
- 가운데 글자 가져오기 자바
Archives
- Today
- Total
NineTwo meet you
[알고리즘] 최단 경로 알고리즘 : 벨만 포드 (Bellman-Ford) 본문
반응형
벨만 포드 (Bellman-Ford)
- 단일 시작점 최단 경로 알고리즘
- 음수 간선 포함 가능
동작 과정
그래프에서 최단 경로가 한 정점을 두 번 지나는 일은 없다.
최단 경로는 최대 V개의 정점을 갖기 때문에 잘해야 V-1개의 간선을 가질 수 있다.
따라서 모든 간선에 대한 완화 과정은 V-1번이면 충분하다.
음수 사이클 판정
완화를 V번 시도하면 된다.
음수 사이클이 존재하지 않다면 V-1번이면 최단 거리를 찾아낼 수 있다.
만일 V번째 완화 과정에서 한번더 완화가 성공한다면 이는 음수 사이클이 존재한다고 생각할 수 있게 된다.
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 boolean bellmanFord() {
dis[1] = 0; // 출발 노드 초기화
for(int i = 1; i < n; i++) { // n-1번 완화 과정
for(int j = 1; j < road.length; j++) {
for(edge next: road[j]) {
if(dis[j] + next.time < dis[next.node]) {
dis[next.node] = dis[j] + next.time;
}
}
}
}
for(int j = 1; j < road.length; j++) { // n번째 완화 과정
for(edge next: road[j]) {
if(dis[j] + next.time < dis[next.node]) { // 음수 사이클 존재하는 경우
return true;
}
}
}
return false; // 음수 사이클 존재하지 않는 경우
}
static class edge{
int node; // 노드
int time; // 걸리는 시간
edge(int node, int time) {
this.node = node;
this.time = time; }
}
반응형
'CS > 알고리즘' 카테고리의 다른 글
[알고리즘] 최소 스패닝 트리 : 프림 (Prim) (0) | 2021.01.24 |
---|---|
[알고리즘] 최소 스패닝 트리 : 크루스칼 (Kruskal) (0) | 2021.01.24 |
[알고리즘] 최단 경로 알고리즘 : 플로이드 와샬 (Floyd Warshall) (0) | 2021.01.20 |
[알고리즘] 최단 경로 알고리즘 : 다익스트라 (Dijsktra) (0) | 2021.01.19 |
[알고리즘] 깊이 우선 탐색 (depth-first search) : DFS (0) | 2021.01.05 |
Comments