트리 초기화

시간 제한1초메모리 제한1024 MB

요약
가중치가 있는 트리에서 루트 선택 횟수를 최소로 하여 부모에서 자식으로 가중치를 옮기는 연산만으로 모든 정점의 가중치를 0으로 만드는 최소 횟수를 구한다.
난이도

어려움10점 중 8점

유형
트리, DFS, 그리디, 수학
정답자
아직 제출이 없습니다

문제

트리를 가지고 놀던 재찬이는 문득 특정 연산을 몇 번 수행해야 트리를 초기화할 수 있을지 궁금해졌다.

트리 초기화란 가중치가 있는 NN개의 정점을 가진 트리에서, 모든 정점의 가중치를 00으로 만드는 것을 의미한다.

트리에서는 다음 두 가지 연산을 수행할 수 있다.

  1. 임의의 정점 rr을 트리의 루트로 설정한다.
  2. 부모 정점 uu에서 자식 정점 vv로 임의의 양의 정수 xx만큼 가중치를 이동한다.

한 정점 uu가 다른 정점 vv의 부모라는 것은, uu와 vv가 간선으로 직접 연결되어 있으면서, 현재 설정된 루트에서 vv로 가는 최단 경로가 uu를 거쳐 감을 의미한다. uu에서 vv로 가중치를 xx만큼 이동하면 uu의 가중치는 xx만큼 감소하고, vv의 가중치는 xx만큼 증가한다. 이 연산은 uu, vv의 현재 가중치와 무관하게 수행할 수 있다.

초기에는 루트가 설정되어 있지 않으며, 22번 연산을 수행하기 위해서는 11번 연산을 최소 한 번 수행해야 한다. 22번 연산은 얼마든지 사용할 수 있지만, 11번 연산의 횟수는 최소가 되도록 해야 한다.

트리를 초기화하는 데 필요한 11번 연산의 최소 횟수를 구해보자.

입력

첫째 줄에 정점의 개수 NN이 주어진다. (2≤N≤100,000)(2 \leq N \leq 100\\,000)

둘째 줄에 NN개 정점의 가중치 W_iW\_i가 공백을 사이에 두고 주어진다. (∣W_i∣≤109,(|W\_i| \leq 10^9, W_iW\_i는 정수))

이후 N−1N-1개의 줄에 걸쳐 트리를 이루는 간선의 정보를 나타내는 두 정수 uu, vv가 공백으로 구분되어 주어진다. 이는 uu번 정점과 vv번 정점을 잇는 간선이 존재한다는 의미이다. (1≤u,v≤N1 \leq u, v \leq N, u≠vu \ne v)

출력

첫째 줄에 트리를 초기화하기 위해 필요한 11번 연산의 최소 횟수를 출력한다. 불가능하다면 -1을 출력한다.

예제3

  1. 예제 1

    입력
    3
    -3 7 -4
    1 2
    2 3
    
    예상 출력
    1
    
  2. 예제 2

    입력
    6
    1 -2 4 -3 2 -2
    1 2
    2 3
    3 4
    3 5
    3 6
    
    예상 출력
    2
    
  3. 예제 3

    입력
    4
    -4 2 5 -1
    1 2
    2 3
    2 4
    
    예상 출력
    -1