結果
| 問題 |
No.1094 木登り / Climbing tree
|
| ユーザー |
|
| 提出日時 | 2021-12-23 23:32:31 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,776 ms / 2,000 ms |
| コード長 | 1,132 bytes |
| コンパイル時間 | 194 ms |
| コンパイル使用メモリ | 82,176 KB |
| 実行使用メモリ | 141,744 KB |
| 最終ジャッジ日時 | 2024-09-18 19:09:02 |
| 合計ジャッジ時間 | 36,248 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 26 |
ソースコード
N = int(input())
G = [[] for _ in range(N+1)]
for _ in range(N-1):
a,b,c = map(int,input().split())
G[a].append((b,c))
G[b].append((a,c))
n = 1
while 1 << n < N:
n += 1
dp = [[0] * (N+1) for _ in range(n)]
depth = [0] * (N+1)
depth2 = [0] * (N+1)
q = []
q.append((1,0))
while len(q):
now,parent = q.pop()
for v,c in G[now]:
if v != parent:
depth[v] = depth[now] + c
depth2[v] = depth2[now] + 1
q.append((v,now))
dp[0][v] = now
for i in range(1,n):
for j in range(1,N+1):
dp[i][j] = dp[i-1][dp[i-1][j]]
def lca(u,v):
if u == v:
return u
if depth2[v] > depth2[u]:
u,v = v,u
delta = depth2[u] - depth2[v]
for j in range(n):
mask = 1 << j
if delta & mask:
u = dp[j][u]
if u == v:return u
for k in reversed(range(n)):
if dp[k][u] != dp[k][v]:
u = dp[k][u]
v = dp[k][v]
return dp[0][u]
Q = int(input())
for _ in range(Q):
s,t = map(int,input().split())
l = lca(s,t)
ans = depth[s] + depth[t] - 2 * depth[l]
print(ans)