-
Notifications
You must be signed in to change notification settings - Fork 2
/
generators.clj
45 lines (40 loc) · 1.34 KB
/
generators.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
(ns longest-path.generators
(:require [clojure.data.int-map :as set]))
(defn generate-random-2tree [n]
{:pre [(> n 1)]}
(loop [acc (transient (set/int-map 0 (set/int-set [1]), 1 (set/int-set [0])))
edges [[0 1]]
i 2]
(if (= i n)
acc
(let [[k l] (rand-nth edges)]
(recur (assoc! acc
i (set/int-set [k l])
k (conj (acc k) i)
l (conj (acc l) i))
(conj edges [k i] [l i])
(inc i))))))
(defn generate-max-internal-edges-2tree [n]
{:pre [(> n 1)]}
(loop [acc (transient (set/int-map 0 (set/int-set [1]),
1 (set/int-set [0])))
i 2]
(if (= i n)
acc
(let [k (dec i)
Nk (acc k)
l (dec k)]
(recur (assoc! acc
i (set/int-set [k l])
k (conj Nk i)
l (conj (acc l) i))
(inc i))))))
(defn generate-min-internal-edges-2tree [n]
{:pre [(> n 1)]}
(loop [i 2
acc (transient (set/int-map 0 (set/dense-int-set (range 1 n))
1 (set/dense-int-set (conj (range 2 n) 0))))]
(if (= i n)
acc
(recur (inc i)
(assoc! acc i (set/int-set [0 1]))))))