Решение
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()
}