https://coderun.yandex.ru/problem/all-paths-lead-to-rome Средняя

Решение

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter

private fun allPathsLeadToRome(verticesCount: Int, edges: List<Pair<Int, Int>>): Int? {
    // Создание множества кандидатов на звание столицы (все города изначально)
    val vertices = mutableSetOf<Int>().also { it.addAll(List(verticesCount) { i -> i }) }

    // Убираем города, у которых есть исходящие дороги
    edges.forEach { edge ->
        if (edge.first != edge.second) {
            vertices.remove(edge.first)
        }
    }

    // Если кандидатов не один, столицы нет
    if (vertices.size != 1) {
        return null
    }
    val candidate = vertices.first()

    // Проверяем, ведут ли дороги из всех остальных городов в столицу
    val to = mutableSetOf<Int>()
    edges.forEach { edge ->
        if (edge.second == candidate && edge.first != candidate) {
            to.add(edge.first)
        }
    }

    // Если дороги идут из всех остальных городов, возвращаем номер столицы
    return if (to.size == verticesCount - 1) candidate else null
}

// Вспомогательные функции
private fun BufferedWriter.println(s: Any = "") {
    write(s.toString())
    newLine()
}

private fun <T> List<T>.toPair(): Pair<T, T> {
    require(size == 2) { "Incorrect size" }
    return Pair(first(), last())
}

fun main() {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))

    // Чтение количества городов и дорог
    val (verticesCount, edgesCount) = reader.readLine().split(" ").map { it.toInt() }

    // Чтение списка дорог
    val edges = List(edgesCount) {
        reader.readLine().split(" ").map { it.toInt() - 1 }.toPair()
    }

    // Поиск номера города Рим
    val res = allPathsLeadToRome(verticesCount, edges)

    // Вывод результата (номер города или -1)
    writer.println(res?.plus(1) ?: -1)

    reader.close()
    writer.close()
}