일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 자바
- 포트앤어댑터 아키텍처
- 비트마스크
- 파이썬
- Redis
- 백준
- DP
- 이펙티브 자바
- docker
- equals
- pandas
- 위상정렬
- 데이터 flow
- series
- dataframe
- dfs
- java
- 알고리즘
- 문자열
- JPA
- 다익스트라
- 스프링
- spring security
- springboot
- 세그먼트 트리
- 헥사고날 아키텍처
- BFS
- UML
- ddd
- disjoint set
- Today
- Total
코딩못하는사람
플로이드-와샬 알고리즘(11404 플로이드) 본문
플로이드-와샬 알고리즘
다익스트라 알고리즘이 한 정점에서 모든 정점까지의 최단거리를 구해주는 알고리즘이라면
플로이드-와샬 알고리즘은 모든정점에서 모든정점으로의 최단거리를 구해주는 알고리즘이다.
다이나믹 프로그래밍을 기반으로 거쳐가는 정점을 기준으로 한다는 특징이 있다.
다익스트라와 다른점은 다익스트라는 힙을 이용하여 일차원 배열에 값을 나타냈으므로 입력을 받을 때
adj[시작점]=(가중치,목적지)를 받았다면 플로이드는 2차원배열 adj[시작점][목적지]=가중치로 저장한다는 차이가 있다.
임의의 노드 s에서 e까지 가는 데 걸리는 최단거리를 구하기 위해, s와 e 사이의 노드인 m에 대해 s에서 m까지 가는 데 걸리는 최단거리와 m에서 e까지 가는 데 걸리는 최단거리를 이용한다.
식으로 설명해보자면 현재의 table에서 adj[s][e]보다 adj[s][m]+adj[m][e]가 작다면 갱신해준다는 뜻이다.
처음봤을때는 이렇게하면 놓치는 부분이 많을 것이라고 생각했지만 for문을 3번돌리면서 맨위 for문에 거쳐가는 정점 k를 기반으로 계속 돌리므로 모든 경우의 수를 돌았다. 즉 시간이 오래걸리는 알고리즘이다.
시간복잡도는 O(n^3)로 문제에서 n이 너무크다면 다른방법을 써야한다.
플로이드 대표문제로 코드를 보자.
플로이드
11404번: 플로이드
첫째 줄에 도시의 개수 n(1 ≤ n ≤ 100)이 주어지고 둘째 줄에는 버스의 개수 m(1 ≤ m ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 �
www.acmicpc.net
1.접근
n이 100밖에 되지않고 모든도시의 쌍을 구하라고 한다. 당연히 플로이드 알고리즘을 적용해야한다.
2.풀이
우선 모든 입력을 받아서 배열에 집어넣어야 한다. 여기서 시작 도시와 도착 도시를 연결하는 노선은 하나가 아닐 수 있다는 조건이 있어서 배열에는 항상 최솟값이 들어가야 한다.
배열을 채운후에는 플로이드 알고리즘을 적용하면 끝난다. 출발점과 시작점이 같은 곳은 0으로 바꿔준다. 또 길이 없는 경우 INF값일 것이므로 0으로 바꿔준다.
3.코드
4.배운점
-
i==j일 때 0으로 초기화 하지않으면 자기 자신으로 돌아오는 최단거리도 구할 수 있다
-
놓치는 경우가 있을거라고 생각했지만 없었다. 알고리즘을 의심하지말자
'알고리즘 정리' 카테고리의 다른 글
KMP 알고리즘(문자열 찾기) (1) | 2020.09.11 |
---|---|
CCW 알고리즘 (선분 교차 판별) (1) | 2020.09.09 |
벨만-포드 알고리즘(11657 타임머신) (1) | 2020.09.02 |
다익스트라 알고리즘 (1753 최단경로) (1) | 2020.09.02 |
유니온 파인드, disjoint set (4195 친구 네트워크) (1) | 2020.08.28 |