728x90
https://www.acmicpc.net/problem/1967
1967번: 트리의 지름
파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연
www.acmicpc.net
해당 문제는 깊이 우선탐색으로 문제를 해결 하였습니다.
1. 아무노드로 부터 시작하여 깊이우선탐색을 하여 가장 긴 노드를 찾습니다.
2. 가장 긴 노드로부터 다시 깊이우선탐색을하여 다른 노드까지의 긴 길이를 찾습니다.
가장 긴 길이가 트리 의 지름입니다.
이유 : 트리는 사이클이 없어서, 한 노드로부터 다른 한노드까지의 경로는 단 하나 존재합니다.
따라서 아무 노드로부터 시작하여 끝점을 구한뒤 그 끝점에서부터 다른 하나의 끝점 까지의 거리를 구하면 트리의 길이가 됩니다.
따라서 깊이우선탐색을 2번 해주면 원하는 결과를 얻을 수 있습니다. 임의의 한점을 루트로 잡았습니다.
import sys
sys.setrecursionlimit(10001)
n = int(input())
graph = [[] for _ in range(n+1)]
for _ in range(n-1):
a, b, c = map(int, input().split())
graph[a].append((b,c))
graph[b].append((a,c))
def dfs(node, cost):
global max_distance, farthest_node
visited[node] = True
if cost > max_distance:
max_distance = cost
farthest_node = node
for v1, distance in graph[node]:
if not visited[v1]:
dfs(v1, cost + distance)
max_distance = -1
farthest_node = 0
visited = [False for _ in range(n+1)]
dfs(1, 0) # 첫 번째 DFS
visited = [False for _ in range(n+1)]
max_distance = -1
dfs(farthest_node, 0) # 두 번째 DFS
print(max_distance)
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 13023번 : ABCDE (0) | 2023.08.25 |
---|---|
[백준] 1937번 : 욕심쟁이 판다 (0) | 2023.08.24 |
[백준] 1043번 : 거짓말 (0) | 2023.08.22 |
[백준] 1976번 : 여행 가자 (0) | 2023.08.21 |
[백준] 1717번 : 집합의 표현 (0) | 2023.08.21 |