```go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
var n int
if _, err := fmt.Fscan(reader, &n); err != nil {
return
}
c := make([]int, n+1)
tot := 0
for i := 1; i <= n; i++ {
fmt.Fscan(reader, &c[i])
if c[i] == 1 {
tot++
}
}
adj := make([][]int, n+1)
for i := 0; i < n-1; i++ {
var u, v int
fmt.Fscan(reader, &u, &v)
adj[u] = append(adj[u], v)
adj[v] = append(adj[v], u)
}
W0 := make([]bool, n+1)
for i := 1; i <= n; i++ {
if c[i] == 1 {
W0[i] = true
for _, v := range adj[i] {
W0[v] = true
}
}
}
if tot < 2 {
for i := 1; i <= n; i++ {
if i > 1 {
fmt.Fprint(writer, " ")
}
fmt.Fprint(writer, "0")
}
fmt.Fprintln(writer)
return
}
if tot == 2 {
for i := 1; i <= n; i++ {
if i > 1 {
fmt.Fprint(writer, " ")
}
if W0[i] {
fmt.Fprint(writer, "1")
} else {
fmt.Fprint(writer, "0")
}
}
fmt.Fprintln(writer)
return
}
sz := make([]int, n+1)
maxBranch := make([]int, n+1)
order := make([]int, 0, n)
qBFS := []int{1}
visitedBFS := make([]bool, n+1)
visitedBFS[1] = true
parent := make([]int, n+1)
for len(qBFS) > 0 {
u := qBFS[0]
qBFS = qBFS[1:]
order = append(order, u)
for _, v := range adj[u] {
if !visitedBFS[v] {
visitedBFS[v] = true
parent[v] = u
qBFS = append(qBFS, v)
}
}
}
for i := n - 1; i >= 0; i-- {
u := order[i]
sz[u] = c[u]
for _, v := range adj[u] {
if v != parent[u] {
sz[u] += sz[v]
if sz[v] > maxBranch[u] {
maxBranch[u] = sz[v]
}
}
}
up := tot - sz[u]
if up > maxBranch[u] {
maxBranch[u] = up
}
}
inK := make([]bool, n+1)
K_intersect_W0 := false
for i := 1; i <= n; i++ {
if maxBranch[i] <= tot-2 {
inK[i] = true
if W0[i] {
K_intersect_W0 = true
}
}
}
if K_intersect_W0 {
for i := 1; i <= n; i++ {
if i > 1 {
fmt.Fprint(writer, " ")
}
fmt.Fprint(writer, "1")
}
fmt.Fprintln(writer)
return
}
win := make([]bool, n+1)
visited := make([]bool, n+1)
q := make([]int, 0)
for i := 1; i <= n; i++ {
if inK[i] {
visited[i] = true
q = append(q, i)
}
}
for len(q) > 0 {
u := q[0]
q = q[1:]
for _, v := range adj[u] {
if !visited[v] {
visited[v] = true
win[v] = W0[v] || win[u]
q = append(q, v)
}
}
}
for i := 1; i <= n; i++ {
if i > 1 {
fmt.Fprint(writer, " ")
}
if inK[i] {
fmt.Fprint(writer, "0")
} else {
if win[i] {
fmt.Fprint(writer, "1")
} else {
fmt.Fprint(writer, "0")
}
}
}
fmt.Fprintln(writer)
}
```