728x90
문제 보기
이 문제는 플로이드-워셜 문제이다.
여행이 가능한 지 확인하기 위해서는 모든 경로에 대한 정보가 필요하다.
플로이드-워셜을 사용하면 모든 도시 사이의 거리를 구할 수 있다.
플로이드-워셜 알고리즘은 3중 for문을 통해 쉽게 구현할 수 있다.
플로이드-워셜을 통해서 모든 도시 사이의 거리를 구한 후 여행을 하면서 만약 해당 지점에 도착할 수 없으면 NO를 출력하였다.
* 자기 자신에게 여행을 가는 경우도 있다!
코드
if __name__ == "__main__":
n = int(input()) # 총 도시의 수
m = int(input()) # 여행 계획에 속한 도시들의 수
graph = [list(map(int, input().split())) for _ in range(n)]
move = list(map(int, input().split()))
# 플로이드-워셜 알고리즘을 통해 모든 노드 간의 최소 거리를 구한다.
for i in range(n):
for j in range(n):
if graph[i][j] == 0 and i != j: # 길이 없다는 뜻
graph[i][j] = 1e9 # 10억으로 대입
for k in range(n):
for i in range(n):
for j in range(n):
graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j])
# 여행 여부 확인
flag = True
pre_index = move[0] - 1
for i in range(1, m):
if graph[pre_index][move[i] - 1] >= 1e9: # 길이 없는 경우
flag = False
break
else:
pre_index = move[i] - 1
if flag:
print("YES")
else:
print("NO")
728x90
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[ 백준 19235 ] 모노미노도미노 - Python (0) | 2020.09.20 |
---|---|
[ 백준 2206 ] 벽 부수고 이동하기 - Python (0) | 2020.09.03 |
[ 백준 1826 ] 연료 채우기 - Python (0) | 2020.08.31 |
[ 백준 1647 ] 도시 분할 계획 - Python (0) | 2020.08.31 |
[ 백준 1655 ] 가운데를 말해요 - Python (0) | 2020.08.30 |