https://coderun.yandex.ru/problem/new-year-fair/description Средняя

Решение

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

// Класс для представления графа и поиска компонент связности
class Graph(val n: Int) {
    val adj = Array(n + 1) { mutableListOf<Int>() } // Список смежности
    
    fun addEdge(u: Int, v: Int) { // Добавление ребра
        adj[u].add(v)
        adj[v].add(u)
    }
    
    fun dfs(v: Int, visited: BooleanArray) { // Обход в глубину
        visited[v] = true
        for (u in adj[v]) {
            if (!visited[u]) dfs(u, visited)
        }
    }
    
    fun countComponents(): Int { // Подсчет компонент связности
        val visited = BooleanArray(n + 1)
        var components = 0
        for (v in 1..n) {
            if (!visited[v]) {
                dfs(v, visited)
                components++
            }
        }
        return components
    }
}

// Нахождение максимального количества удаляемых маршрутов
fun maxRemovableRoutes(n: Int, m: Int, edges: Array<Pair<Int, Int>>): Int {
    val graph = Graph(n) // Создание графа
    edges.forEach { (u, v) -> graph.addEdge(u, v) } // Добавление всех маршрутов
    val components = graph.countComponents() // Подсчет компонент связности
    val minEdges = n - components // Минимальное количество ребер для связности
    return m - minEdges // Количество удаляемых маршрутов
}

fun main(args: Array<String>) {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))
    
    val (n, m) = reader.readLine().split(" ").map { it.toInt() } // Чтение n и m
    val edges = Array(m) { // Чтение маршрутов
        val (u, v) = reader.readLine().split(" ").map { it.toInt() }
        Pair(u, v)
    }
    
    val result = maxRemovableRoutes(n, m, edges) // Вычисление результата
    writer.write(result.toString()) // Вывод результата
    writer.newLine()
    
    reader.close()
    writer.close()
}