import sys input = sys.stdin.readline def dfs(node,flag,*args): stack = [(node,0)] distance_list = [0 for _ in range(N+1)] visited = [False for _ in range(N+1)] visited[node] = True if not flag: visited[args[0]] = True while stack: node,distance = stack.pop() distance_list[node] = distance for next_node in graph[node]: if not visited[next_node]: visited[next_node] = True stack.append((next_node,distance+graph[node][next_node])) temp = [] for i in range(1,N+1): temp.append((distance_list[i],i)) temp.sort(key=lambda x :-x[0]) if flag: return_value = temp[0][1] else: return_value = temp[0][0] return return_value N = int(input()) graph = [{} for _ in range(N+1)] for _ in range(N-1): x,y,pay = map(int,input().split()) graph[x][y] = pay graph[y][x] = pay first_point = dfs(1,True) second_point = dfs(first_point,True) first_value = dfs(first_point,False,second_point) second_value = dfs(second_point,False,first_point) print(max(first_value,second_value))
이 문제는 트리의 지름을 구하는 방법을 응요한 문제이다.
총 4번의 dfs를 통해 두번째 트리의 지름을 알 수 있다.
첫번째 dfs를 통해 아무지점에서 가장 먼 지점을 구한다.
이 지점은 지름을 구성하는 한 점이 될것이다.
두번째 dfs를 통해 첫번째 dfs에서 구한 점에서 가장 먼 점을 구한다.
그러면 이 점은 트리의 지름을 구성하는 가장 먼 점이 될것이다.
이렇게 2번의 dfs를 통해 우리는 가장 먼 점 2개를 구했다.
그러면 이 2점을 각각 dfs를 돌려, 가장 먼 점에서 2번째인 것을 찾아낸다.
그리고 이렇게 두 거리를 구한 뒤 그 중에 더 큰 점을 선택하면 되는 문제이다.
import sys input = sys.stdin.readline def dfs(node): distance_list = [0 for _ in range(N+1)] visited = [False for _ in range(N+1)] visited[node] = True stack = [(node,0)] while stack: node,distance = stack.pop() distance_list[node] = distance for next_node in graph[node]: if not visited[next_node]: visited[next_node] = True stack.append((next_node,graph[node][next_node]+distance)) return distance_list N = int(input()) graph = [{} for _ in range(N+1)] for _ in range(N-1): x,y,pay = map(int,input().split()) graph[x][y] = pay graph[y][x] = pay distance1 = dfs(1) far_point1 = distance1.index(max(distance1)) distance2 = dfs(far_point1) far_point2 = distance2.index(max(distance2)) distance3 = dfs(far_point2) result = sorted(distance2+distance3)[-3] print(result)
단 3번의 dfs를 통해 구하는 방법도 있다.
이 방법은 지름을 구성하는 2점의 전체길이를 한 리스트로 정하고 뒤에서 3번째를 출력해주는 것이다.
왜냐하면 한 리스트당 한 지점에서 가장 먼 지점은 서로 자신들이기 때문에, 그 2점을 제외하고 그 다음번으로 큰 것이
두번째 트리의 지름의 답이된다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 20924 트리의 기둥과 가지 (0) | 2021.06.07 |
---|---|
[BOJ/백준] 20300 서강근육맨 (0) | 2021.06.07 |
[BOJ/백준] 15644 구슬 탈출 3 (0) | 2021.06.07 |
[BOJ/백준] 3056 007 (0) | 2021.06.07 |
[BOJ/백준] 16188 달빛 여우 (0) | 2021.06.07 |