Python/[코드트리]
[코드트리] 2차원 배열 입력 > 플로이드-워셜 알고리즘(Warshall algorithm)
hyunnn_00
2023. 7. 12. 16:36
플로이드-워셜 알고리즘
한 정점으로부터 다른 모든 정점까지의 최단거리를 모든 정점에 대해 구하는 알고리즘

dist[A][B] = min(dist[A][B], dist[A][C] + dist[C][B])
- 왼쪽과 같은 그래프가 존재할 때, 오른쪽 표는 i -> j로 가는 최단거리
- 자기 자신은 0으로, 도달할 수 없는 노드(선으로 연결되어 있지 않은 노드)는 무한대로 초기화
플로이드 와샬 알고리즘은 노드 선택 순서가 중요!
제일 먼저 거칠 노드 C를 정한 후, 시작 노드 A와 도착 노드 B를 정해야 함
=> 그래야 시작 노드에서 도착 노드의 최솟값 갱신이 순서에 상관없이 가능
ex)
2번 노드를 거쳐 가는 경우

이 그래프에서 2번 노드를 거쳐가면서 경로가 짧아지는 경우는 3번 노드 -> 4번 노드로 가는 경우
따라서 값이 ∞->4로 변경됨
(방향이 정해져 있으므로 대칭행렬 아님)
3번 노드를 거쳐 가는 경우

1번 노드 -> 2번노드는 6 -> 5로
4번 노드 -> 2번 노드 ∞->2로 갱신
마지막으로 4번 노드를 거치는 경우

1번 노드 -> 3번 노드 4->2
1번 노드 -> 2번 노드 5 -> 3으로 갱신
이전 3번 노드를 거치면서 최소 거리를 갱신했으므로 이렇게 구할 수 있음
2번 노드 -> 3번 노드 ∞->4로 갱신
이러한 원리로 모든 정점에서 다른 모든 정점까지의 최단거리를 구할 수 있다.
문제
arr = [[0, 0, 1],
[1, 0, 0],
[0, 1, 0]]
for k in range(3):
for i in range(3):
for j in range(3):
if arr[i][k] and arr[k][j]:
arr[i][j] = 1
result = 0
for i in range(3):
result += sum(arr[i])
print(result)
#### 결과
9
실행 풀이
f947a5e8-5501-4496-b30a-8f7edadb0e56.mp4
1.82MB