
동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인지 알아보자. 물론 중간에 다른 도시를 경유해서 여행을 할 수도 있다. 예를 들어 도시가 5개 있고, A-B, B-C, A-D, B-D, E-A의 길이 있고, 동혁이의 여행 계획이 E C B C D 라면 E-A-B-C-B-C-B-D라는 여행경로를 통해 목적을 달성할 수 있다.
도시들의 개수와 도시들 간의 연결 여부가 주어져 있고, 동혁이의 여행 계획에 속한 도시들이 순서대로 주어졌을 때 가능한지 여부를 판별하는 프로그램을 작성하시오. 같은 도시를 여러 번 방문하는 것도 가능하다.
예제 입력 1
3
3
0 1 0
1 0 1
0 1 0
1 2 3
예제 출력 1
YES
YES 출력NO 출력import sys
input = sys.stdin.readline
def find_parent(parent, x):
if parent[x] != x:
parent[x] = find_parent(parent, parent[x])
return parent[x]
def union_parent(parent, i, j):
a = find_parent(parent, i)
b = find_parent(parent, j)
if a < b:
parent[b] = a
else:
parent[a] = b
def solution():
# 입력
N = int(input())
M = int(input())
graph = []
for _ in range(N):
graph.append(list(map(int, input().split())))
cities = set(map(int, input().split()))
parent = [i for i in range(N)]
# 도시는 0번도시부터 N-1번 도시까지 있음
for i in range(N):
for j in range(i+1, N):
if graph[i][j] == 1: # i번 도시와 j번 도시가 연결되어 있으면
union_parent(parent, i, j)
can_tour = True
parent_set = set()
for city in cities:
parent_set.add(find_parent(parent, city-1))
if len(parent_set) == 1:
print("YES")
else:
print("NO")
if __name__ == "__main__":
solution()