만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

트리 채우기

면접 대비

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

요약
루트가 1인 트리에서 일부 정점에 붙은 스티커를 바탕으로 남은 스티커를 부모의 번호가 자식보다 크도록 채울 수 있는지 판별하고, 가능하면 한 가지 배치를 출력합니다.
난이도

보통10점 중 6점

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

문제

11번부터 NN번까지 총 NN개의 정점으로 이루어진 트리와 11번부터 NN번까지 서로 다른 번호가 붙은 NN개의 스티커가 주어진다. 트리는 11번 정점을 루트로 한다. 동건이는 각 정점에 스티커를 하나씩 붙이려고 한다. 단, 부모 정점의 스티커 번호는 자식 정점의 스티커 번호보다 커야 한다.

원빈이가 일부 정점에 스티커를 미리 붙여 두었다. 동건이를 도와 위 규칙에 맞게 나머지 스티커를 모두 붙일 수 있는지 구해보자.

입력

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

두 번째 줄에 NN개의 정수 a1,…,aNa_1, \ldots, a_N이 주어진다. ai=0a_i=0이면 ii번 정점에 아직 스티커가 없다는 뜻이다. 1≤ai≤N1 \le a_i \le N이면 ii번 정점에 번호 aia_i의 스티커가 붙어 있다는 뜻이다. 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를 출력하고, 둘째 줄에 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