개의 방이 있는 개미집이 있다. 각 방에는 번부터 번까지 서로 다른 번호가 붙어 있다. 서로 다른 개의 방을 잇는 굴이 개가 있다. 임의의 방에서 임의의 다른 방으로 하나 이상의 굴을 통해서 이동하는 것이 가능하다.
초기에 번 방에는 마리의 개미가 있다. 모든 방의 개미의 마리 수를 합하면 , , 중 하나의 값이 된다.
많은 수의 개미가 한 방에 모인 경우 생활 환경이 좋지 않기 때문에 각 방에 있는 개미의 수를 제한하고자 한다. 구체적으로, 모든 방에 있는 개미의 수가 혹은 가 되게 하는 것이 목표이다. 개미들은 굴을 따라 다른 방으로 자유롭게 이동할 수 있다. 각 개미가 이동한 거리는 거쳐간 굴의 개수로 정의된다.
목표를 달성하기 위해 개미들이 이동해야 하는 거리의 총합의 최소값을 구하는 프로그램을 작성하라.
입력 형식
첫 줄에 방의 개수를 나타내는 정수 이 주어진다.
그다음 줄에 초기에 각 방에 있는 개미의 마리 수를 나타내는 개의 정수 이 공백으로 구분되어 차례대로 주어진다. (; 은 , , 중 하나와 같다.)
그다음 개의 줄에 걸쳐, 모든 굴의 정보가 주어진다. 각 줄에는 각 굴이 잇는 서로 다른 개의 방 번호가 공백으로 구분되어 주어진다.
출력 형식
첫 줄에 개미들의 이동 거리의 총합의 최솟값을 출력한다.
예제 1
입력
5 0 1 2 0 2 1 2 1 3 2 4 2 5
출력
3
예제 2
입력
5 0 0 2 4 1 1 2 2 3 3 4 4 5
출력
5
예제 설명
아래 그림은 두 번째 예제를 나타낸다. 각 방 위의 값은 방 번호이다. 그림의 (a) 는 초기에 각 방에 있는 개미의 수를 보여 준다. 그림의 (a) 에서 화살표는 목표를 달성하기 위해 개미 마리가 이동한 것을 보여준다. 개미들이 이동을 마치고 나면 그림의 (b) 와 같이 되어 목표가 달성된다. 두 마리의 개미가 이동한 거리의 총합은 이다.

채점 방식
입력 케이스들은 다음과 같은 종류로 구별되며, 한 종류의 케이스를 다 맞혀야 그 종류에 배정된 점수를 받을 수 있다.
종류 1: 13점
번째 굴은 번 방과 번 방을 연결하는 굴이다.
종류 2: 9점
종류 3: 7점
종류 4: 12점
모든 방의 개미 수의 총합은 이다.
종류 5: 21점
모든 방의 개미 수의 총합은 이다.
종류 6: 38점
모든 입력 케이스가 주어진다.
해설
트리의 각 정점 에 대해, 그 서브트리에 포함된 개미 수와 서브트리 크기의 차이를 라 합시다. 이는 해당 서브트리에 개미가 얼마나 남거나 부족한지를 나타내며, 이면 그만큼의 개미가 부모 쪽으로 이동하고, 이면 부모로부터 개미가 들어와야 합니다.
총 개미 수가 일 때, 와 의 부모를 잇는 간선을 따라 이동하는 개미 수는 이므로 전체 최소 이동 거리는 가 됩니다.
일 때는 정확히 한 정점만 개미를 두 마리 가져야 합니다. 어떤 정점을 로 정했을 때, 루트에서 까지의 경로에 있는 간선들의 이동량만 변합니다. 각 간선의 변화량을 라 하면, 이를 루트에서 까지 누적한 이 “정점 에 개미를 한 마리 더 두었을 때 절약되는 이동 거리”가 됩니다. 따라서 이 경우의 최소 이동 거리는 로 구할 수 있습니다.
마지막으로 인 경우에는 두 정점에 개미를 두 마리씩 둬야 합니다. 두 정점을 , 그들의 최소 공통 조상을 이라고 하면, 루트에서 까지의 경로는 두 마리의 개미가 모두 지나가므로 이동량이 2만큼 증가하고, 에서 로 내려가는 두 갈래 경로에서는 각각 1만큼 증가합니다.
이 성질을 이용하면, 각 정점을 공통 조상 후보로 두고 생각했을 때, 그 정점의 서로 다른 두 자식(또는 자기 자신 포함)에서 얻을 수 있는 “개미를 한 마리 더 남겼을 때의 절약 효과”를 각각 구해 두 개를 더한 뒤, 공통 구간의 중복 부분을 한 번만 반영하도록 보정하면 답을 구할 수 있습니다.
위의 모든 과정은 여러 번의 DFS를 통해 필요한 값을 구할 수 있으므로, 전체 시간복잡도 에 문제를 해결할 수 있습니다.