https://coderun.yandex.ru/problem/mugs/description Сложная

Решение

import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.BufferedWriter
import java.io.OutputStreamWriter
import java.util.PriorityQueue
import java.util.ArrayList

fun main(args: Array<String>) {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))

    val n = reader.readLine().toInt()

    val revAdj = Array(n + 1) { ArrayList<Int>() }
    val outDegree = IntArray(n + 1)

    for (courseIndex in 1..n) {
        val parts = reader.readLine().split(" ")
        val k = parts[0].toInt()

        if (k > 0) {
            for (j in 1..k) {
                val prerequisiteCourse = parts[j].toInt()
                revAdj[courseIndex].add(prerequisiteCourse)
                outDegree[prerequisiteCourse]++
            }
        }
    }

    val pq = PriorityQueue<Int>(compareByDescending { it })

    for (i in 1..n) {
        if (outDegree[i] == 0) {
            pq.add(i)
        }
    }

    val resultReversed = ArrayList<Int>(n)

    while (pq.isNotEmpty()) {
        val u = pq.poll()
        resultReversed.add(u)

        for (p in revAdj[u]) {
            outDegree[p]--
            if (outDegree[p] == 0) {
                pq.add(p)
            }
        }
    }

    val finalOrder = resultReversed.reversed()

    if (finalOrder.size != n) {
    } else {
        writer.write(finalOrder.joinToString(" "))
        writer.newLine()
    }

    reader.close()
    writer.close()
}