Решение
import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.BufferedWriter
import java.io.OutputStreamWriter
// Функция для вычисления расстояний от стартовой вершины до всех остальных с помощью DFS
fun dfs(start: Int, graph: List<List<Pair<Int, Int>>>, distances: LongArray, visited: BooleanArray) {
visited[start] = true
for ((next, weight) in graph[start]) {
if (!visited[next]) {
distances[next] = distances[start] + weight
dfs(next, graph, distances, visited)
}
}
}
fun main() {
val reader = BufferedReader(InputStreamReader(System.`in`)) // Инициализация чтения из ввода
val writer = BufferedWriter(OutputStreamWriter(System.out)) // Инициализация вывода
// Читаем количество вершин
val n = reader.readLine().toInt()
// Создаём граф как список смежности
val graph = List(n + 1) { mutableListOf<Pair<Int, Int>>() }
repeat(n - 1) {
val (a, b, c) = reader.readLine().split(" ").map { it.toInt() }
graph[a].add(b to c)
graph[b].add(a to c) // Добавляем ребро в обе стороны
}
// Минимальный 2-радиус
var minRadius = Long.MAX_VALUE
// Проверяем каждое ребро как пару центров (u, v)
for (u in 1..n) {
for ((v, weight) in graph[u]) {
if (u < v) { // Чтобы не проверять одно ребро дважды
// Вычисляем расстояния от u
val distU = LongArray(n + 1) { Long.MAX_VALUE }
distU[u] = 0
dfs(u, graph, distU, BooleanArray(n + 1))
// Вычисляем расстояния от v
val distV = LongArray(n + 1) { Long.MAX_VALUE }
distV[v] = 0
dfs(v, graph, distV, BooleanArray(n + 1))
// Находим максимальное min(distance(u,w), distance(v,w)) для всех w
var maxMinDist = 0L
for (w in 1..n) {
val minDist = minOf(distU[w], distV[w])
maxMinDist = maxOf(maxMinDist, minDist)
}
minRadius = minOf(minRadius, maxMinDist)
}
}
}
// Выводим результат
writer.write(minRadius.toString())
writer.newLine()
// Закрываем потоки
reader.close()
writer.close()
}