페이지를 불러오는 중…
해결한 사람
1
명
정답률
100.00
%
시간 제한
1000
ms
메모리 제한
2048
MB
싱가포르 인터넷 백본(SIB)은 개의 기지국으로 이루어져 있는데, 각 기지국은 부터 까지 번호가 매겨져 있다. 기지국들은 부터 까지 번호가 매겨진 개의 양방향 링크로 연결되어 있다. 각 링크는 서로 다른 두 기지국을 연결한다. 같은 링크로 연결된 두 기지국은 이웃이라고 한다.
기지국 에서 기지국 까지의 경로는 서로 다른 기지국 의 서열인데, 이고 이다. 또한 서열에서 연속한 두 기지국은 이웃이다. 어떤 두 기지국 와 를 고르더라도, 이 둘을 잇는 경로는 정확하게 하나이다.
기지국 는 패킷(데이터 덩어리)을 만들고 이를 다른 기지국 로 보낼 수 있는데, 이 기지국을 패킷의 목표라고 한다. 이 패킷은 에서 를 잇는 유일한 경로를 따라 전송되어야 한다. 현재 패킷이 기지국 에 있고, 이 패킷의 목표가 기지국 ()라고 하자. 이 상황에서 기지국 는 다음 일을 한다.
그러나 기지국의 메모리가 제한되어서 싱가포르 인터넷 백본의 모든 링크를 저장하여 라우팅 절차를 수행할 수 없다.
여러분이 할 일은 싱가포르 인터넷 백본에서 사용할 라우팅 방법을 구현하는 것이다. 이는 다음 두 프로시저로 이루어진다.
첫 번째 프로시저에서는 , 싱가포르 인터넷 백본의 링크 목록, 정수 을 입력으로 받는다. 이 프로시저에서는 각 기지국에 이상 이하인 서로 다른 정수 레이블을 할당한다.
두 번째 프로시저가 라우팅 절차이고, 레이블이 할당된 다음에 모든 기지국에서 적용된다. 이 프로시저에서는 오직 다음 입력만 주어진다.
패킷이 전송될 의 이웃의 레이블을 리턴해야 한다.
한 서브태스크에서는 여러분의 점수는 기지국에 할당된 레이블 값의 최대값과 관련이 있다. 일반적으로 이 값이 작을수록 좋다.
다음 함수들을 구현해야 한다.
int[] label(int n, int k, int[] u, int[] v)
int find_next_station(int s, int t, int[] c)
각각의 테스트 케이스는 하나 이상의 독립적인 시나리오, 즉 싱가포르 인터넷 백본의 다른 상황을 포함한다. 개의 시나리오를 포함하는 테스트 케이스 하나에 대해서, 위의 함수를 호출하는 프로그램은 다음과 같이 정확히 두 번 실행된다.
프로그램이 첫 번째 실행될 때는 다음과 같다.
label 함수가 번 호출된다.find_next_station은 호출되지 않는다.프로그램이 두 번째 실행될 때는 다음과 같다.
find_next_station 함수가 여러 번 호출될 수 있다. 각각의 호출마다 임의의 시나리오가 선택되며, 이 시나리오에서 label 함수에 의해 리턴된 레이블이 find_next_station 함수의 입력으로 사용된다.label은 호출되지 않는다.특히 프로그램이 첫 번째 실행되었을 때 정적 변수나 전역 변수에 저장된 값들은 find_next_station 함수에서 사용할 수 없다.
다음 호출을 생각해 보자.
label(5, 10, [0, 1, 1, 2], [1, 2, 3, 4])
모두 개의 기지국이 있고, , , , 를 잇는 개의 링크가 있다. 각 레이블은 이상 이하인 정수이다.
다음과 같이 레이블을 매긴 것을 리턴하기 위해서는
| 번호 | 레이블 |
|---|---|
| 0 | 6 |
| 1 | 2 |
| 2 | 9 |
| 3 | 3 |
| 4 | 7 |
label 함수는 을 리턴한다. 다음 그림의 숫자들은 왼쪽은 번호를, 오른쪽은 각 기지국에 할당된 레이블을 의미한다.

위와 같이 레이블이 할당되었을 때 다음 호출을 생각해 보자.
find_next_station(9, 6, [2, 7])
이는 패킷이 레이블 에 해당하는 기지국에 있고, 목표 기지국의 레이블은 이라는 뜻이다. 목표까지 경로에 있는 기지국들의 레이블은 이다. 따라서 이 함수의 리턴 값은 라야 하는데, 패킷이 전송되어야 하는 기지국의 레이블에 해당한다. 이 기지국의 번호는 이다.
또 다른 가능한 호출을 생각해 보자.
find_next_station(2, 3, [3, 6, 9])
이 함수의 리턴 값은 이라야 하는데, 레이블이 인 목표 기지국은 레이블이 인 기지국의 이웃이고, 따라서 바로 패킷을 보내 줄 수 있기 때문이다.
label의 각 호출에 대해서:
find_next_station의 각 호출에 대해서 입력은 이전의 label 호출 중 임의로 고른 하나에서 선택한다. 이 호출에서 만든 레이블을 생각해 보자. 그러면 다음을 만족한다.
각각의 테스트 케이스에서 모든 시나리오를 다 합쳐서 find_next_station 함수로 넘겨지는 모든 배열 의 길이의 총합은 을 넘지 않는다.
서브태스크 5에서 부분 점수를 받을 수 있다. 이 모든 시나리오를 통틀어서 label 함수가 리턴한 가장 큰 레이블 값이라고 하자. 이 서브태스크에서 여러분의 점수는 다음 표에 의해 계산된다.
| 최대 레이블 | 점수 |
|---|---|
다음 개의 블록이 따라오고, 각각의 블록은 시나리오 하나를 기술한다. 각 블록의 형식은 다음과 같다.
find_next_station의 호출 횟수find_next_station 함수를 호출하였을 때 연관된 기지국들의 번호. 기지국 에 현재 패킷이 있고, 기지국 가 패킷의 목표 기지국이며, 기지국 가 패킷이 전송되어야 하는 기지국이다.입력된 개 시나리오의 순서대로 해당하는 개의 블록을 출력한다. 각 블록의 형식은 다음과 같다.
find_next_station의 번째 호출에서 리턴되는 레이블에 해당하는 기지국의 번호샘플 그레이더가 매번 실행될 때마다 label과 find_next_station을 모두 호출하는 데 유의하시오.
1
5 10
0 1
1 2
1 3
2 4
2
2 0 1
1 3 3
9
1
3
International Olympiad in Informatics (IOI) 2020, official task package and official Korean statement.
Reporch에서 한국어 번역, 수식 표기, 이미지 호스팅 및 형식을 수정했습니다.
로그인 상태를 확인하는 중입니다.