[Python]伯準/gold/1967:ツリーの直径
質問リンク:https://www.acmicpc.net/problem/1967
木の直径については、以前習ったことがあるので、簡単に解けます.https://velog.io/@heyksw/ツリーの-直径
BFSで解くのが便利で、練習のためにわざとDFSで解く.注目すべきは、ルートから最も遠い2つのノードに延長するのではなく、ルートから最も遠いノードを探してから、ノード上でDFSを再実行して、最も遠いノードを再検索することです.
また、visitリストを初期化する際にforv in visitのような条件が設定されていると役に立たず、実際に変更を適用するにはインデックスで値にアクセスして変更する必要があります.
Pythonコード
木の直径については、以前習ったことがあるので、簡単に解けます.https://velog.io/@heyksw/ツリーの-直径
BFSで解くのが便利で、練習のためにわざとDFSで解く.注目すべきは、ルートから最も遠い2つのノードに延長するのではなく、ルートから最も遠いノードを探してから、ノード上でDFSを再実行して、最も遠いノードを再検索することです.
また、visitリストを初期化する際にforv in visitのような条件が設定されていると役に立たず、実際に変更を適用するにはインデックスで値にアクセスして変更する必要があります.
Pythonコード
import sys
sys.setrecursionlimit(10**6)
N = int(sys.stdin.readline())
tree = [[] for _ in range(N+1)]
for _ in range(N-1):
a, b, c = map(int, sys.stdin.readline().split())
tree[a].append((b, c))
tree[b].append((a, c))
leaf = []
visit = [False] * (N+1)
def dfs(node, distance):
visit[node] = True
end = True
for x in tree[node]:
if not visit[x[0]]:
end = False
dfs(x[0], distance + x[1])
if end:
leaf.append((node, distance))
dfs(1, 0)
leaf.sort(key=lambda x : x[1])
point1 = leaf[-1]
leaf.clear()
for i in range(len(visit)):
visit[i] = False
dfs(point1[0], 0)
leaf.sort(key=lambda x:x[1])
point2 = leaf[-1]
print(point2[1])
Reference
この問題について([Python]伯準/gold/1967:ツリーの直径), 我々は、より多くの情報をここで見つけました https://velog.io/@heyksw/Python-백준-gold-1967-트리의-지름テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol