件名の説明:
方法の一つ:深さ優先:
クラスのソリューション: DEF treeDiameter(自己、エッジ:リスト[一覧[INT]]) - > int型: 隣接 = collections.defaultdict(セット) のための I、J におけるエッジ: 隣接[i]の.add(j)の 隣接関係[J] .add(I) メモ = {} DEF DFS(I、J): もし(i、j)の中のメモ: 戻りメモ[I、J] 最長 = 0 のための K に隣接[J]: もし K == I:続ける 最長 = MAX(最長、DFS(J、K)) メモ[(I、J)] =最長+ 1枚の 戻りメモ[(I、J)] のために I、J で:エッジ DFS(i、j)は (DFS j、i)に対して リターン MAX(メモ[(I、J)] +メモ[(J、I)] - 1 用の I、J でエッジ)
方法2:幅優先
クラスのソリューション: DEF treeDiameter(自己、エッジ:リスト[一覧[INT]]) - > int型: 隣接 = collections.defaultdict(セット) のための I、J におけるエッジ: 隣接[i]の.add(j)の 隣接関係[J] .add(I) DEF BFS(ノード): キュー = collections.deque() queue.append((ノード0)) メモ = {ノード} ながらキュー: N、長い = queue.popleft() のために寧で隣接[N]: もしネイない でメモ: memo.add(ネイ) queue.append((寧、長い +1 )) リターンN、長い 遠い、長い = BFS(0) far2、最長 = BFS(遠) リターン最長