[파이썬] 백준 1976번 여행 가자
작성:
백준 #1976 여행 가자
# 출력: 여행 경로가 가능한지 여부 YES / NO
# 다른 도시를 경유해서 여행할 수도 있고, 중복해서 갈 수도 있다
# 경로를 하나하나 찾기엔 경우의 수가 너무 많아진다
# 도시들이 연결 되는지 여부만 따져서 모두 연결되면 YES 출력
# union-find 자료구조를 사용한다.
import sys
input = sys.stdin.readline
def find(x, parents):
if parents[x] == x: return x
parents[x] = find(parents[x], parents)
return parents[x]
def union(x, y, parents, ranks):
xroot = find(x, parents)
yroot = find(y, parents)
if ranks[xroot] >= ranks[yroot]:
parents[yroot] = xroot
else:
parents[xroot] = yroot
if ranks[xroot] == ranks[yroot]:
ranks[xroot] += 1
def solution():
N = int(input())
M = int(input())
parents = [i for i in range(N)]
ranks = [0 for i in range(N)]
idx = 1
for i in range(N):
inp = list(map(int, input().split()))
for j in range(idx, N):
if inp[j]: union(i, j, parents, ranks)
plan = list(map(int, input().split()))
comp = find(plan[0] - 1, parents)
for i in range(1, len(plan)):
if find(plan[i]-1, parents) != comp:
print('NO')
return
else:
print('YES')
if __name__ == '__main__':
solution()
댓글남기기