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 |
Tags
- 문자열 압축
- 스프링
- 투어
- 1로 만들기
- 서블릿
- 스프링 MVC
- Servlet
- dp
- 알고리즘
- 2589
- 쓰레드 풀
- 2638
- 설탕 배달
- 프로그래머스
- 양꼬치
- 2020 KAKAO BLIND
- mvc
- HTTP API
- BFS
- 동적 프로그래밍
- 포두부 보쌈
- 고모네 콩탕
- 맛집 투어
- 호유동
- 완도산회
- 다이나믹 프로그래밍
- Spring
- 2839
- 백준
- 맛집
Archives
- Today
- Total
프로그래밍 공방
플로이드 와샬 : Floyd Warshall 본문
플로이드 와샬 : Floyd Warshall
가중치가 있는 그래프에서 모든 정점의 쌍에 대해 최단 경로를 찾는 알고리즘
* 플로이드 와샬 알고리즘은 다이나믹 프로그래밍의 한 예로 핵심 아이디어는 아래와 같다.
어떤 두 정점 사이의 최단 경로는 어떤 경유지를 거치거나 거치지 않는 경로 중 하나
예시
위와 같은 그래프가 있을 때, 각 정점에서 정점으로의 최단 경로를 나타내는 배열은 우측과 같다.
자기 자신은 0이고 간선이 존재하지 않는다면 INF를 넣어준다.
모든 경로에 대해 경유지 K를 거쳐갔을 때와 비교해가며 최단 경로를 계산해준다.
-> A-B와 A-K + K-B를 비교한다.
* 특징
- 모든 가능한 경유지에 대해 모든 정점에서 다른 모든 정점으로 가는 최단 거리를 확인하므로 O(n^3)가 걸린다.
- 방향이 있는 그래프와 방향이 없는 그래프에서 다 사용 가능하다.
- 음의 cycle(cycle의 간선 합계가 음수)이 있는 그래프에서는 사용할 수 없다.
코드 예시
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
32
33
34
35
36
37
38
|
class FloydWarshall {
public static int[][] edge;
public static int[][] floydWarshall;
public static void main(String[] args) {
int vertex = 7;
edge = new int[vertex+1][vertex+1];
floydWarshall = new int[vertex+1][vertex+1];
int[][] inputEdge = {{1, 2, 3}, {1, 5, 2}, {5, 3, 5}, {3, 4, 7}, {3, 6, 3}, {3, 7, 8}, {2, 7, 2}};
for(int i=0; i<inputEdge.length; i++) {
edge[inputEdge[i][0]][inputEdge[i][1]] = inputEdge[i][2];
edge[inputEdge[i][1]][inputEdge[i][0]] = inputEdge[i][2];
}
for(int i=1; i<floydWarshall.length; i++) {
for(int j=1; j<floydWarshall[i].length; j++) {
if(i==j) floydWarshall[i][j] = 0;
else {
if(inputEdge[i][j]==0) floydWarshall[i][j] = Integer.MAX_VALUE>>1;
else floydWarshall[i][j] = edge[i][j];
}
}
}
for(int k=1; k<=vertex; k++) {
for(int i=1; i<floydWarshall.length; i++) {
for(int j=1; j<floydWarshall[i].length; j++) {
if(floydWarshall[i][j]>floydWarshall[i][k]+floydWarshall[k][j]) floydWarshall[i][j]=floydWarshall[i][k]+floydWarshall[k][j];
}
}
}
for(int i=1; i<floydWarshall.length; i++) {
for(int j=1; j<floydWarshall[i].length; j++) {
System.out.print(floydWarshall[i][j]+" ");
}
System.out.println();
}
}
}
|
cs |
관련 문제
'개발 > 알고리즘' 카테고리의 다른 글
크루스칼 알고리즘 : Kruskal's Algorithm (0) | 2021.03.08 |
---|---|
다익스트라 알고리즘 : Dijkstra Algorithm (0) | 2021.03.07 |
위상 정렬 : Topological Sorting (0) | 2021.01.27 |
Lower / Upper Bound : 하한 / 상한 알고리즘 (0) | 2020.12.05 |
최소 공통 조상 알고리즘 : LCA(Lowest Common Ancestor) (0) | 2020.12.05 |