https://coderun.yandex.ru/problem/two-centers/description Средняя

Решение

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()
}