ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [PS] 1167. 트리의 지름
    Problem Solving 2024. 3. 6. 17:01

    https://www.acmicpc.net/problem/1167

     

    1167번: 트리의 지름

    트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지

    www.acmicpc.net


    문제 요약

    트리의 지름이란, 트리에서 임의의 두 점 사이의 거리 중 가장 긴 것을 말한다. 트리의 지름을 구하는 프로그램을 작성하시오.


    문제 접근

    첫번 째, (실패)

    DFS를 이용하여 1~n까지의 노드에 대해 각각 가장 거리가 먼 노드까지의 거리를 구한 후, 구한 값 중 MAX값을 출력하도록 하였다. 정답은 나오지만, 시간초과가 발생하였다...

    파이썬이라서 안되는건가? 하고 PyPy3로 시도하여도 시간초과가 발생하여서 다른 접근 방법을 찾다가 결국 검색을 시도했다.. , ,,, ㅜ

     

    두번 째, (성공)

    검색결과, 빠른 시간내에 풀 수 있는 가장 핵심적인 원리를 알게되었다..!

     

    A-B까지의 거리를 트리의 지름이라고 할 때, 각 노드에서 가장 멀리 떨어져 있는 노드까지의 경로의 일부는 A-B까지의 경로와 겹친다!!! 이 원리로 시뮬레이션을 돌려보면, 어느 노드에서 출발하여도 가장 멀리 떨어진 노드는 A or B인 것을 알 수 있다.

     

    따라서, DFS를 두번 돌리는 것으로 변경하였다.

    임의의 노드에서 A 혹은 B를 구한 후, 만약 A라면 B까지의 거리를, B라면 A까지의 거리를 구하도록 했다.

     

    더보기
    import sys
    from collections import deque
    
    V = int(sys.stdin.readline())
    tree = [dict() for v in range(V+1)]
    for v in range(V):
      input_list = list(map(int, sys.stdin.readline().split()))
      it = iter(input_list)
      index = next(it)
      num = next(it)
      while (num != -1):
        tree[index][num] = next(it)
        num = next(it)
    
    def far_point(start):
      max_cost = 0
      end_num = start
      cost = [0 for v in range(V+1)]
      stack = deque()
      stack.append(start)
      record = set()
    
      while (stack):
        now = stack.pop()
        if cost[now] > max_cost:
          max_cost = cost[now]
          end_num = now
        if now not in record:
          record.add(now)
          for to in tree[now].keys():
            if to not in record:
              stack.append(to)
              cost[to] = cost[now] + tree[now][to]
      
      return max_cost, end_num
    
    print(far_point(far_point(1)[1])[0])

    다음부턴,, 문제를 풀기전에 생각을 더하고 제출해봐야겠다

    'Problem Solving' 카테고리의 다른 글

    [PS] 1149. RGB거리  (0) 2024.01.08
    [PS] 1043. 거짓말  (2) 2024.01.07
Designed by Tistory.