abc138 d 'ki' (python3)
for i in range(n-1): u, v = map(int, input().split()) u -= 1 v -= 1 g[u].append(v) g[v].append(u)
としてやればよく、辺を全て全探索するには、
def dfs(now, prev): for next in g[now]: if next != prev: #ここに条件式をいれる dfs(next, now)
としたらよい。
今回の問題は、1を根とした木が与えられて、ある頂点(例えば3とする)の点数は、3から1までを一直線につなぐまでに通る点数の合計となる。
python で再帰を使うときはデフォルトが1000回までなので、今回は10**6回ぐらいまでできるようにしておくのを忘れずに(REが多発する)
import sys input = sys.stdin.readline import sys sys.setrecursionlimit(1000000) n, q = map(int, input().split()) g = [[] * n for i in range(n)] for i in range(n-1): u, v = map(int, input().split()) u -= 1 v -= 1 g[u].append(v) g[v].append(u) chk = [0]*n for i in range(q): x, y = map(int, input().split()) chk[x-1] += y def dfs(now, prev): # 今いる頂点から行ける頂点を順に next に入れてループ for next in g[now]: if next != prev: chk[next] += chk[now] dfs(next, now) dfs(0,-1) print(*chk)
# リストはglobal宣言の必要がないんかしら?