aacord’s memo

abcを中心にpythonで解いた問題のメモ、整理をしています。緑になった。

abc138 d 'ki' (python3)


辺がn-1本あるので、すべての頂点が一つの木を構成しているとわかる。辺のリストを管理するには、

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宣言の必要がないんかしら?