1N = int(input())
2M = int(input())
3
4parent = [i for i in range(N)]
5
6def find(node):
7 if parent[node] != node:
8 parent[node] = find(parent[node])
9 return parent[node]
10
11def union(a, b):
12 a = find(a)
13 b = find(b)
14 if a < b:
15 parent[b] = a
16 else:
17 parent[a] = b
18
19for i in range(N):
20 for j, item in enumerate(map(int, input().split())):
21 if item:
22 union(i, j)
23
24path = list(map(int, input().split()))
25start = parent[path[0]-1]
26for i in range(1, M):
27 if parent[path[i]-1] != start:
28 print("NO")
29 break
30else:
31 print('YES')
문제
- 서로 연결 된 도시에 대한 정보와 여행 계획에 있는 도시의 정보가 주어진다
- 여행 계획에 속한 도시들 중 연결이 안된 도시가 있다면 “NO”, 없다면 “YES"를 출력하면 된다
-
TC
- input
3
3
0 1 0
1 0 1
0 1 0
1 2 3 - output
YES
- input
해결 방법
- 연결된 도시에 대한 정보가 나오면 바로 유니온 연산을 수행한다
- 여행 계획에 속한 도시들이 모두 같은 집합에 속해 있는지 검사한다
고찰
- find 함수가 호출 되었을때, 재귀적으로 호출되면서 parent를 업데이트 시켜주어야 하는데, 그러지 않고 단순히 parent node를 반환만 하는 함수로 구현해서 여러 번 틀렸다.