반응형
문제
https://www.acmicpc.net/problem/1167
1167번: 트리의 지름
트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지
www.acmicpc.net
풀이
DFS를 사용해서 풀 수 있습니다.
임의의 노드에서 출발하여 가장 먼 거리에 있는 노드를 탐색해줍시다.
임의의 노드에서 출발하여 가장 먼 거리에 있는 노드는 트리의 지름에 포함되는 노드입니다.
가장 먼 거리에 있는 노드를 찾았다면 그 노드에서 부터 가장 깊은 곳이 트리의 지름이 됩니다.
소스코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let n = Int(readLine()!)! | |
var graph = [[(Int, Int)]](repeating: [], count: n + 1) | |
var visited = [Bool](repeating: false, count: n + 1) | |
for _ in 0..<n { | |
let input = readLine()!.dropLast(2).split(separator: " ").map { Int($0)! } | |
let node = input[0] | |
var index = 1 | |
while index < input.count { | |
graph[node].append((input[index], input[index + 1])) | |
index += 2 | |
} | |
} | |
var endNode: (node: Int, cost: Int) = (node: 0, cost: 0) | |
func dfs(node: Int, depth: Int) { | |
visited[node] = true | |
if depth > endNode.cost { | |
endNode = (node, depth) | |
} | |
for (nextNode, distance) in graph[node] { | |
if !visited[nextNode] { | |
visited[nextNode] = true | |
dfs(node: nextNode, depth: depth + distance) | |
visited[nextNode] = false | |
} | |
} | |
} | |
dfs(node: 1, depth: 0) | |
visited = [Bool](repeating: false, count: n + 1) | |
dfs(node: endNode.node, depth: 0) | |
print(endNode.cost) |
후기
처음에는 모든 노드에 대해 DFS나 다익스트라를 해봐야하나... 생각이 들었습니다.
하지만 정점의 개수가 최대 10만이므로, 두 방식으로는 시간초과가 나게됩니다.
블로그 글을 참고해서 풀이하였고, 이런 방법은 직접 떠올리지 못해서 아쉬웠습니다.😂
반응형
'PS > 백준' 카테고리의 다른 글
[BOJ] 백준 1991 트리 순회 (Swift) (0) | 2023.05.15 |
---|---|
[BOJ] 백준 1967 트리의 지름 (Swift) (0) | 2023.05.15 |
[BOJ] 백준 11725 트리의 부모 찾기 (Swift) (0) | 2023.05.15 |
[BOJ] 백준 11780 플로이드 2 (Swift) (0) | 2023.05.15 |
[BOJ] 백준 11779 최소비용 구하기 2 (Swift) (1) | 2023.05.15 |