페이지를 불러오는 중…
해결한 사람
1
명
정답률
100.00
%
시간 제한
2000
ms
메모리 제한
2048
MB
건축가 티모시는 새로운 탈출 게임을 설계했다. 이 게임에는 개의 방이 있다. 방들은 번부터 번까지 번호가 붙어 있다. 처음에 각 방에는 정확히 하나의 열쇠가 있다. 각 열쇠는 하나의 타입에 속하는데, 타입들은 번부터 번까지 번호가 붙어 있다. 방들 중 ()번 방에 있는 열쇠의 타입은 이다. 여러 개의 방이 같은 타입의 열쇠를 가지고 있을 수도 있다. 즉, 들 중에 같은 값들이 있을 수 있다.
방들을 잇는 개의 양방향 복도들이 있다. 복도들은 번부터 번까지 번호가 붙어 있다. 복도들 중 ()번 복도는 번 방과 번 방을 연결한다 (). 한 쌍의 방을 연결하는 복도가 여러 개일 수 있다.
이 게임은 참가자 한 명이 플레이한다. 참가자는 방들을 다니며 열쇠를 모으며 게임을 플레이한다. 참가자가 번 방에서 번 방으로 (혹은 그 반대로) 번 복도를 이용해서 이동하는 것을 번 복도를 사용한다고 부른다. 참가자가 번 복도를 사용하기 위해서는 그 전에 타입의 열쇠를 얻었어야 한다.
게임하는 도중 번 방에서 참가자가 할 수 있는 행동은 아래 두 가지이다. (둘 다 할 수도 있다.)
참가자가 열쇠를 버리는 경우는 없다.
참가자는 열쇠 없이 어떤 번 방에서 시작한다. 번 방에서 시작했을 때 위의 행동을 임의로 반복해 번 방에 갈 수 있는 방법이 존재한다면 번 방은 도달 가능하다고 부른다.
각각의 ()번 방에 대해서, 번 방에서 시작했을 때 도달 가능한 방들의 개수를 라고 하자. 티모시는 가 최소가 되는 방 번호 ()들의 집합을 찾고 싶다.
다음 함수를 구현해야 한다.
int[] find_reachable(int[] r, int[] u, int[] v, int[] c)
r: 길이 인 배열. 각 ()에 대해, 번 방에 있는 열쇠의 타입은 이다.u, v: 길이 인 두 배열. 각 ()에 대해, 번 복도는 번과 번 방을 연결한다.c: 길이 인 배열. 각 ()에 대해, 번 복도를 사용하기 위해 필요한 열쇠의 타입은 이다.다음 호출을 보자.
find_reachable( [0, 1, 1, 2], [0, 0, 1, 1, 3], [1, 2, 2, 3, 1], [0, 0, 1, 0, 2] )
참가자가 번 방에서 시작하는 경우, 다음과 같은 과정을 통해서 번 방에 갈 수 있다.
| 현재 방 | 행동 |
|---|---|
| 0 | 타입 의 열쇠를 얻음 |
| 0 | 번 복도를 사용해 번 방으로 이동 |
| 1 | 타입 의 열쇠를 얻음 |
| 1 | 번 복도를 사용해 번 방으로 이동 |
| 2 | 번 복도를 사용해 번 방으로 이동 |
| 1 | 번 복도를 사용해 번 방으로 이동 |
따라서 번 방은 번 방에서 시작했을 때 도달 가능하다. 비슷한 방법으로 다른 모든 방으로 가는 방법을 만들 수 있으므로 이다. 아래 표는 각 방에서 시작했을 때 도달 가능한 방들의 리스트를 보여 준다.
| 시작 방 번호 | 도달 가능한 방들 | |
|---|---|---|
| 0 | 4 | |
| 1 | 2 | |
| 2 | 2 | |
| 3 | 3 |
모든 들 중 가장 작은 값은 이며, 혹은 인 경우들이다. 따라서 이 함수는 을 리턴해야 한다.
find_reachable( [0, 1, 1, 2, 2, 1, 2], [0, 0, 1, 1, 2, 3, 3, 4, 4, 5], [1, 2, 2, 3, 3, 4, 5, 5, 6, 6], [0, 0, 1, 0, 0, 1, 2, 0, 2, 1] )
아래 표는 도달 가능한 방들을 보여 준다.
| 시작 방 번호 | 도달 가능한 방들 | |
|---|---|---|
| 0 | 7 | |
| 1 | 2 | |
| 2 | 2 | |
| 3 | 4 | |
| 4 | 2 | |
| 5 | 4 | |
| 6 | 2 |
모든 들 중 가장 작은 값은 이며, 인 경우들이다. 따라서 이 함수는 을 리턴해야 한다.
find_reachable([0, 0, 0], [0], [1], [0])
아래 표는 도달 가능한 방들을 보여 준다.
| 시작 방 번호 | 도달 가능한 방들 | |
|---|---|---|
| 0 | 2 | |
| 1 | 2 | |
| 2 | 1 |
모든 들 중 가장 작은 값은 이며, 인 경우이다. 따라서 이 함수는 을 리턴해야 한다.
line 1: n m line 2: r[0] r[1] … r[n - 1] line 3 + j (0 ≤ j ≤ m - 1): u[j] v[j] c[j]
Sample Grader는 find_reachable의 리턴 값을 다음과 같이 출력한다.
line 1: a[0] a[1] … a[n - 1]
4 5
0 1 1 2
0 1 0
0 2 0
1 2 1
1 3 0
3 1 2
0 1 1 0
7 10
0 1 1 2 2 1 2
0 1 0
0 2 0
1 2 1
1 3 0
2 3 0
3 4 1
3 5 2
4 5 0
4 6 2
5 6 1
0 1 1 0 1 0 1
3 1
0 0 0
0 1 0
0 0 1
Sample Grader의 입력 양식은 아래와 같다.
International Olympiad in Informatics (IOI) 2021, official task package and official Korean statement.
Reporch에서 한국어 번역, 수식 표기, 이미지 호스팅 및 형식을 수정했습니다.
로그인 상태를 확인하는 중입니다.