Решение
import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.BufferedWriter
import java.io.OutputStreamWriter
data class Tower(val x: Int, val y: Int)
fun dist(t1: Tower, t2: Tower): Double {
val dx = t1.x - t2.x
val dy = t1.y - t2.y
return Math.sqrt((dx * dx + dy * dy).toDouble())
}
fun dfs(graph: List<List<Int>>, colors: IntArray, v: Int, color: Int): Boolean {
colors[v] = color
for (u in graph[v]) {
if (colors[u] == 0) {
if (!dfs(graph, colors, u, 3 - color)) return false
} else if (colors[u] == color) {
return false
}
}
return true
}
fun canColor(towers: List<Tower>, power: Double, colors: IntArray): Boolean {
val n = towers.size
val graph = List(n) { mutableListOf<Int>() }
for (i in 0 until n) {
for (j in i + 1 until n) {
if (dist(towers[i], towers[j]) < 2 * power) {
graph[i].add(j)
graph[j].add(i)
}
}
}
colors.fill(0)
for (i in 0 until n) {
if (colors[i] == 0) {
if (!dfs(graph, colors, i, 1)) return false
}
}
return true
}
fun findMaxPower(n: Int, towers: List<Tower>): Pair<Double, IntArray> {
var left = 0.0
var right = 20000.0
val colors = IntArray(n)
lateinit var bestColors: IntArray
repeat(50) {
val mid = (left + right) / 2
if (canColor(towers, mid, colors)) {
left = mid
bestColors = colors.copyOf()
} else {
right = mid
}
}
return Pair(left, bestColors)
}
fun main(args: Array<String>) {
val reader = BufferedReader(InputStreamReader(System.`in`))
val writer = BufferedWriter(OutputStreamWriter(System.out))
val n = reader.readLine().toInt()
val towers = mutableListOf<Tower>()
repeat(n) {
val (x, y) = reader.readLine().split(" ").map { it.toInt() }
towers.add(Tower(x, y))
}
val (power, colors) = findMaxPower(n, towers)
writer.write(String.format("%.15f\\n", power))
writer.write(colors.joinToString(" "))
writer.flush()
reader.close()
writer.close()
}