Advertisement
Guest User

Untitled

a guest
Jul 21st, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 1.93 KB | None | 0 0
  1. import kotlin.collections.HashSet
  2.  
  3. data class Edge(val u: Int, val v: Int)
  4.  
  5. fun addEdge(edges: HashSet<Edge>, u: Int, v: Int) {
  6.     edges.add(if (u <= v) Edge(u,v) else Edge(v,u))
  7. }
  8.  
  9. fun main(args: Array<String>) {
  10.     val d = 10
  11.     val rays = 500
  12.     var cur = 0
  13.     fun next() = ++cur
  14.     val ray = Array(rays, {Array(d, {next()})})
  15.     var edges = HashSet<Edge>()
  16.     for (j in ray.indices) {
  17.         addEdge(edges, 0, ray[j][0])
  18.         if (j < rays-1)
  19.             addEdge(edges, ray[j][0], ray[j+1][0])
  20.     }
  21.     for (i in 1..d-1) {
  22.         for (j in ray.indices) {
  23.             addEdge(edges, ray[j][i-1], ray[j][i])
  24.             if (j < rays - 1)
  25.                 addEdge(edges, ray[j][i], ray[j + 1][i])
  26.         }
  27.     }
  28.     val n = rays * d + 1
  29.     for (u in 0..n-1)
  30.         addEdge(edges, u, u)
  31.     for (iter in 0..100) {
  32.         val cnt = edges.count { it.u == 0 }
  33.         System.out.print("$iter: $cnt ")
  34.         if (cnt == n)
  35.             break
  36.         edges = processSaveOldEdges(edges, n)
  37.     }
  38. }
  39.  
  40. private fun process(edges: HashSet<Edge>, n: Int) : HashSet<Edge> {
  41.     val min = Array(n, {n})
  42.     for ((u,v) in edges) {
  43.         min[v] = minOf(min[v], u)
  44.         min[u] = minOf(min[u], v)
  45.     }
  46.     val res = HashSet<Edge>()
  47.     for ((u,v) in edges) {
  48.         addEdge(res, u, min[v])
  49.         addEdge(res, v, min[u])
  50.     }
  51.     for (u in 0..n-1) {
  52.         addEdge(res, u, u)
  53.         addEdge(res, u, min[u])
  54.     }
  55.     return res
  56. }
  57.  
  58. private fun processSaveOldEdges(edges: HashSet<Edge>, n: Int) : HashSet<Edge> {
  59.     val min = Array(n, {n})
  60.     for ((u,v) in edges) {
  61.         min[v] = minOf(min[v], u)
  62.         min[u] = minOf(min[u], v)
  63.     }
  64.     val res = HashSet<Edge>()
  65.     for ((u,v) in edges) {
  66.         addEdge(res, u, min[v])
  67.         addEdge(res, v, min[u])
  68.     }
  69.     for (u in 0..n-1) {
  70.         addEdge(res, u, u)
  71.         addEdge(res, u, min[u])
  72.     }
  73.     res.addAll(edges)
  74.     return res
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement