結果
| 問題 | No.3113 The farthest point |
| コンテスト | |
| ユーザー |
norioc
|
| 提出日時 | 2025-04-19 07:20:52 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,110 bytes |
| 記録 | |
| コンパイル時間 | 344 ms |
| コンパイル使用メモリ | 82,040 KB |
| 実行使用メモリ | 128,504 KB |
| 最終ジャッジ日時 | 2025-04-19 07:21:07 |
| 合計ジャッジ時間 | 13,773 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 20 WA * 13 |
ソースコード
from collections import defaultdict, deque
def tree_diameter_with_weight(n: int, adj: defaultdict) -> tuple[int, list]:
def bfs(start):
q = deque([start])
dists = [-1] * n
dists[start] = 0
while q:
v = q.popleft()
for to, w in adj[v]:
if dists[to] != -1: continue
dists[to] = dists[v] + w
q.append(to)
return dists
dists = bfs(0)
_, ai = max((d, i) for i, d in enumerate(dists))
dists = bfs(ai)
d, bi = max((d, i) for i, d in enumerate(dists))
path = [(bi, d)] # (頂点番号, 距離)
while path[-1][1] > 0:
v, s = path[-1]
for to, w in adj[v]:
if dists[to] == s - w:
path.append((to, s - w))
break
else:
assert False
return d, [v for v, _ in path]
N = int(input())
adj = defaultdict(list)
for _ in range(N-1):
u, v, w = map(int, input().split())
u -= 1
v -= 1
adj[u].append((v, w))
adj[v].append((u, w))
d, _ = tree_diameter_with_weight(N, adj)
print(d)
norioc