11403번 경로찾기
floyd-warshall
11403번 경로찾기
실버 I
💡문제 분석 요약
floyd-warshall
플루이드-워셜
💡알고리즘 설계
플루이드 워셔로 모든 그래프로 갈 수 있는 가중치를 정리한다.
dist를 inf로 초기화 한다.
k를 거쳐서 i→j로 가는거와 i→j로 갈 수 있는 가중치 중 최솟값을 [i][j]에 넣는다.
이때, inf로 나온다는 건 i→j로 가는 경로가 없다는 뜻이므로 0으로 출력한다.. 그리고 inf가 아닌경우 경로가 있다는 뜻이므로 1로 출력한다.
💡코드
import sys
import math
input= sys.stdin.readline
n = int(input())
dist =[]
for i in range(n):
a = input().strip().replace('0','inf')
a = list(map(float,a.split(' ')))
dist.append(a)
for k in range(n):
for i in range(n):
for j in range(n):
dist[i][j] = min(dist[i][j],dist[i][k]+dist[k][j])
#k를 거친 경로 vs i->j로 가는 직통 경로
for i in range(n):
for j in range(n):
if dist[i][j]==math.inf:
print(0,end=' ')
else:
print(1,end=' ')
print('')
💡 헷갈린 이유
- 오랜만에 플루이드워셜 알고리즘을 적용해서 어떻게 값이 들어왔는지 감이 잡히지 않았다.