알고리즘 풀이/백준

[ 백준 1976 ] 여행 가자 - Python

12.tka 2020. 9. 3. 00:05
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