白駿18126アライグマ九九(with Python)


何の問題ですか。


タイトルの質問^^

作成したソリューション


木の概念を利用して解答した.

問題の思考点

  • 題では,「ノード数N,幹線数N−1」という条件を与えた..(下図のように)

  • この図では、ループのツリー構造が現れない...!(2,3,4,5ノードを移動しても、ループ構造は作成できません.)

  • 最後に、少し考えてみれば、Leaf Nodeに着くたびに、最大値を更新することができます.(ノード間の距離はすべて整数であるため、最末端のノードの1つが入口から最も遠くなければならない.)

  • では、leafノードであることをどのように知っていますか?

  • スタック内のノードを取り出すたびに、アクセスチェックが行われます.

  • leaf node:続行できるnodeはありません.

  • leaf node以外のnode:少なくとも1つのノードがアクセスできます.
  • コード実装

    N = int(input())
    
    adj = [[] for _ in range(N+1)]
    
    # 각 노드에서 갈 수 있는 노드를 모두 저장합니다.
    for i in range(N-1):
        n1, n2, l = map(int, input().split())
        adj[n1].append([n2, l])
        adj[n2].append([n1, l])
    
    visited = [0] * (N+1)
    
    # 재귀 깊이 때문에 python 내에서 스택을 선언했습니다. 
    # (시스템 스택 사용 X)
    stack = [[1, 0]]
    
    result = 0
    
    while stack:
        v, l = stack.pop()
        visited[v] = 1
    	
        # leaf node 인지 판별
        flag = False
        # 현재 v 노드가 갈 수 있는 곳이 한곳이라도 있다면 leaf 노드가 아닙니다.
        for tmpv, tmpl in adj[v]:
            if visited[tmpv] == 0:
                flag = True
    	
        # leaf node가 아닌 경우, 스택에 저장합니다.
        if flag == True:
            if adj[v]:
                for nv, nl in adj[v]:
                    if visited[nv] == 0:
                        stack.append([nv, l+nl])
        # leaf node인 경우, 최대값을 갱신해 줍니다.
        else:
            if l > result:
                result = l
    
    print(result)