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