트리 채우기

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

요약
일부 정점에 1부터 N까지의 스티커가 미리 붙은 루트 트리에서 부모의 번호가 자식보다 크도록 나머지 스티커를 붙이거나 불가능함을 판별한다.
난이도

보통10점 중 6점

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

문제

11번부터 NN번까지 총 NN개의 정점으로 이루어진 트리와 11번부터 NN번까지의 서로 다른 번호가 붙어있는 NN개의 스티커가 주어진다. 트리는 11번 정점을 루트로 한다. 심심했던 동건이는 각 정점에 스티커를 붙이려고 한다. 다만, 아무 규칙 없이 스티커를 붙이는 건 너무 시시하기 때문에 부모 정점의 스티커 번호가 자식 정점의 스티커 번호보다 크도록 붙이려고 한다.

그런데 동건이에게 악감정이 있던 원빈이는 일부 정점에 스티커를 미리 붙여버렸다. 계획이 틀어진 동건이는 크게 당황했는데, 동건이를 도와 위 규칙에 맞게 나머지 스티커를 모두 붙일 수 있는지 구해보자.

입력

첫 번째 줄에는 정점의 개수 NN이 주어진다. (2≤N≤1052 \le N \le 10^5)

두 번째 줄에는 NN개의 정수 a_1a\_1, ..., a_na\_n이 주어진다. a_ia\_i는 ii번 정점의 상태를 나타내는데, a_i=0a\_i=0인 경우는 아직 스티커를 붙이지 않은 상태를, 1≤a_i≤N1 \le a\_i \le N인 경우는 ii번 번호의 스티커가 붙여진 상태를 의미한다. 11 이상 NN 이하의 정수는 각각 최대 한 번만 주어진다.

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

출력

위 규칙에 맞게 스티커를 모두 붙일 수 없다면 첫 줄에 NO를 출력한다.

위 규칙에 맞게 스티커를 모두 붙일 수 있다면 첫 줄에 YES를 출력하고 둘째 줄에 NN개의 정점에 붙인 스티커의 번호를 공백으로 구분하여 11번 정점부터 NN번 정점까지 순서대로 출력한다.

만약 스티커를 붙일 수 있는 방법이 여러 개라면 그중 아무거나 출력한다.

예제2

  1. 예제 1

    입력
    12
    12 10 0 2 9 5 0 0 0 0 0 0
    1 2
    1 3
    2 4
    2 5
    3 6
    4 7
    5 8
    6 9
    6 10
    8 11
    8 12
    
    예상 출력
    YES
    12 10 11 2 9 5 1 8 3 4 6 7
    
  2. 예제 2

    입력
    6
    0 3 4 0 0 0
    1 2
    1 3
    2 4
    2 5
    3 6
    
    예상 출력
    NO