시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
---|---|---|---|---|---|
3 초 | 1024 MB | 52 | 11 | 9 | 19.149% |
조차장은 열차의 객차들을 잇거나 떼어 내면서 열차를 유지하고 보수하는 장소이다. 조차장에 는 열차를 움직일 수 있는 선로가 존재한다. 우리는 선로 상에서 열차의 객차들의 위치를 그래프로 나타낼 것이다. 그래프의 각 간선은 열차의 한 객차가 위치한 상태를 나타내고, 따라서 열차는 그래프상의 경로로 나타낸다. 이때, 경로상의 정점들과 간선들은 모두 달라야 한다. 특별히, 문제에서 주어지는 그래프는 항상 트리이다.
그림 1
각각 초기와 마지막 열차의 위치를 나타내는 길이 $m$의 경로 $P$와 $Q$가 주어진다. 경로의 길이는 경로에 포함된 간선의 개수이다. 여기서 두 경로 $P$와 $Q$는 어떠한 간선도 공유하지 않는다. 다시 말해서, $P$와 $Q$가 동시에 지나는 간선은 존재하지 않는다. 우리는 경로 $P$를 이동해서 마지막에 경로 $Q$가 되도록 해야 한다. 이때, 최소 단계의 이동을 찾아야 한다.
$n$개 정점을 가진 트리 $T$와 초기와 마지막 열차를 나타내는 길이 $m$의 경로 $P$와 $Q$가 주어질 때, $P$를 $Q$로 이동할 수 있는지 검사하고 이동할 수 있다면 최소 단계수를 출력하는 프로그램을 작성하시오.
예를 들어, 그림2에서 어떠한 간선도 공유하지 않는 길이 $2$의 두 경로 $P$와 $Q$가 주어진다. 그림에서와 같이 경로 $P$에서 $Q$로 5단계에 이동할 수 있고, 이것이 최소 단계의 이동이다.
그림 2
여러분은 관리자를 위해 다음 두 가지 함수를 구현해야만 한다.
void init(int n, vector<int> X, vector<int> Y) ;
최초에 호출되며 단 한번 호출되는 함수이다. 트리의 정점의 개수는 n
이고 정점은 $1$부터 n
까지의 정수로 나타낸다. X
와 Y
는 크기 n
-1인 vector
로 트리의 각 간선은 (X[i]
, Y[i]
)로 나타낸다.long long train(vector<int> Z) ;
Z
는 크기 $4$인 vector
로 초기 경로 $P$의 두 끝점 Z[0]
과 Z[1]
, 마지막 경로 $Q$의 두 끝점 Z[2]
와 Z[3]
를 나타낸다. $P$를 $Q$로 이동시키는 최소 단계수를 return한다. 만약, 이동할 수 없다면, $-1$을 return한다.여러분은 train.cpp
라는 이름의 정확히 하나의 파일을 제출해야만 한다. 이 파일에는 다음의 두 함수가 구현되어야 한다.
void init(int n, vector<int> X, vector<int> Y) ;
long long train(vector<int> Z) ;
이 함수는 위에서 설명한 것과 같이 동작하여야 한다. 물론, 다른 함수들을 만들어서 내부적으로 사용할 수 있다. 제출한 코드는 입출력을 수행하거나 다른 파일에 접근하여서는 안된다.
주어지는 grader는 다음과 같은 형식으로 입력을 읽는다:
주어지는 grader는 함수 train
의 return 값을 출력한다. 만약, 이동할 수 없다면, $-1$을 출력 한다.
번호 | 배점 | 제한 |
---|---|---|
1 | 11 | $n ≤ 80$, $q ≤ 80$. |
2 | 18 | 경로 $P$의 길이 ≤ 2. |
3 | 34 | 경로 $P$의 길이 $≤ 100$, 모든 경로 $P$의 길이의 합 $≤ 250\,000$. |
4 | 36 | $n ≤ 1\,000$, $q ≤ 1\,000$. |
5 | 51 | 추가 제한이 없다. |
11 2 1 2 3 2 4 3 4 5 6 5 8 4 7 8 8 9 10 9 11 10 3 5 7 4 3 6 7 10
3 7
아래는 예 1에 대해 함수 호출 및 그 결과를 차례대로 보여준다.
함수 호출 | 결과 값 |
---|---|
init( 11, {1, 3, 4, 4, 6, 8, 7, 8, 10, 11}, {2, 2, 3, 5, 5, 4, 8, 9, 9, 10} ) |
|
train( {3, 5, 7, 4} ) |
3 |
train( {3, 6, 7, 10} ) |
7 |
Olympiad > 국제정보올림피아드 대표학생 선발고사 > 2020 > 2차 선발고사 3번
C++17, C++14, C++20, C++14 (Clang), C++17 (Clang), C++20 (Clang)