코드
# 최단거리 X, 연결되어있는지 확인
# 집합에 속해 있는지 확인하는 과정
# 유니온-파인드 이용
import sys
sys.setrecursionlimit(10**5)
input = sys.stdin.readline
n = int(input())
m = int(input())
node = [i for i in range(n+1)] # 부모 노드
def find(a, parent):
if a != parent[a]: # 루트 노드가 아니면
parent[a] = find(parent[a], parent) # 루트 노드 찾기
return parent[a]
def union(a,b,parent):
a = find(a, parent)
b = find(b, parent)
if a < b: # 루트 노드가 작은 값에 합친다
parent[b] = a
else:
parent[a] = b
for i in range(1,n+1):
lst = [*map(int, input().split())]
for j in range(len(lst)):
if lst[j] == 1:
union(i,j+1,node) # 그래프 만들어주기
travel = [*map(int, input().split())] # 여행지
result = set() # 중복을 없애기 위해 집합 이용
for i in travel:
result.add(find(i, node)) # find 함수를 이용해 루트 노드 찾아주기
print("YES") if len(result) == 1 else print("NO") # 1개가 아니면 여행 불가
루트 노드는 parent 배열에서 보장되지 않을 수 있으므로, 재귀를 통해 루트 노드를 찾아주어야 한다.
'백준' 카테고리의 다른 글
[백준] 1016번 제곱 ㄴㄴ 수 파이썬 코드 (0) | 2024.01.22 |
---|---|
[백준] 1850번 최대공약수 파이썬 코드 (1) | 2024.01.21 |
[백준] 17352번 여러분의 다리가 되어 드리겠습니다! 파이썬 코드 (0) | 2024.01.21 |
[백준] 1717번 집합의 표현 파이썬 코드 (1) | 2024.01.21 |
[백준] 9020번 골드바흐의 추측 파이썬 코드 (0) | 2024.01.20 |