[문제]
https://www.acmicpc.net/problem/1967
1967번: 트리의 지름
파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연
www.acmicpc.net
[풀이]
DFS를 이용하여 풀었다.
DFS의 과정은 아래와 같다.
테스트 케이스만 보고 이진트리라고 생각하면 안된다.
정답을 저장한 변수를 0으로 초기화를 한다.
<과정>
1. 더 이상 이동할 자식 노드가 없다면 0을 반환해준다.
2. 자식이 하나만 있다면
- 자식의 가중치 + (자식을 기준으로 DFS) 의 값이 현재 노드 위치에서의 가장 긴 지름이다.
- 정답은, 지름을 찾아야 하므로 트리 전체에서의 가장 긴 지름을 찾아야 하므로 정답과 현재 노드의 지름의 크기를 비교하여 새롭게 갱신을 해준다.
3. 자식이 1명 이상 있다면
- 현재 노드의 자식 숫자만큼 자식의 가중치 + (자식을 기준으로 DFS) 과정을 반복하여, 반환값을 배열에 저장을 해준다.
- 배열을 오름차순으로 정렬을 해주면, 왼쪽 기준 배열에 두 개의 값을 더 해주면 현재 노드의 지름이다.
- 이렇게 구한 현재 노드의 지름을 정답과 비교하여 새롭게 갱신을 해준다.
[코드]
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import kotlin.math.max
lateinit var tree : ArrayList<ArrayList<Pair<Int,Int>>>
var ans = 0
fun main()
{
var br = BufferedReader(InputStreamReader(System.`in`))
var bw = BufferedWriter(OutputStreamWriter(System.out))
var n = br.readLine().toInt()
tree = ArrayList()
repeat(n+1){ tree.add(ArrayList())}
repeat(n-1)
{
val route = br.readLine().split(" ").map{it.toInt()}
tree[route[0]].add(Pair(route[1],route[2]))
}
dfs(1)
bw.write(ans.toString())
bw.flush()
bw.close()
}
fun dfs(node : Int) : Int
{
/* 자식이 없는 경우 */
if(tree[node].isEmpty()) return 0
/* 자식이 1명만 있는 경우 */
if(tree[node].size == 1) {
val tmp = tree[node][0].second + dfs(tree[node][0].first)
ans = max(tmp,ans)
return tmp
}
/* 자식이 1명 이상인 경우 */
var pq = ArrayList<Int>()
repeat(tree[node].size)
{
i ->
pq.add(tree[node][i].second + dfs(tree[node][i].first))
}
pq.sortDescending()
ans = max(pq[0] + pq[1], ans)
return pq[0]
}
'백준 > bfs dfs' 카테고리의 다른 글
백준 [1167] kotlin (0) | 2023.01.16 |
---|---|
백준 [2638] kotlin (0) | 2023.01.15 |
백준 [16234] kotlin (1) | 2023.01.10 |
백준 [4485] kotlin (0) | 2023.01.06 |
백준 10819 [kotlin] (0) | 2023.01.02 |