N 頂点 N-1 辺からなる、自己ループや多重辺が存在しない無向木 G がある。頂点はそれぞれ 1 から N まで番号付けされており、辺もそれぞれ 1 から N-1 まで番号付けされており、i 番目の辺は u_i と v_i を結んでいる。また、i 番目の頂点には非負整数 A_i がそれぞれ割り当てられている。
この木に対して、根 r から以下の擬似コードにしたがって DFS (深さ優先探索) を行うことを考える。
// [input]
// G: dfs の対象となるグラフ
// A: それぞれの頂点に割り当てられた非負整数
// v: dfs を開始する頂点
// step: ステップ数を記録する整数
// [output]
// 以下のうちどちらかの二値
// - SUCCESS: dfs が途中で終了することなく、頂点 v まで戻ってくる
// - FAILURE: dfs が途中で終了する
function dfs(G, A, v, step)
if (A[v] が 0 である) then
return FAILURE
A[v] ← A[v] - 1
step ← step + 1
v の子を頂点番号が小さい順にソート
// c は頂点番号が小さい順に見られる
for each (v の子 c) do
if (dfs(G, A, c, step) が FAILURE である) then
return FAILURE
if (A[v] が 0 である) then
return FAILURE
A[v] ← A[v] - 1
step ← step + 1
return SUCCESS
つまり、与えられた G と A に対して、根 r について
dfs(G, A, r, 0)
を実行することを考える。
それぞれの頂点を根としたときの、この DFS のステップ数を求めよ。
N
A_1 ... A_N
u_1 v_1
...
u_{N-1} v_{N-1}
N 行出力せよ。i 行目には、頂点 i を根としたときのステップ数を出力せよ。
3 1 2 3 1 2 1 3
2 3 3
よって、答えはそれぞれ 2, 3, 3 となる。はじめに根から出発するときも A_i の値を減らすことに注意せよ。
3 1 2 3 1 2 2 3
4 4 5