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