blob: 0bb06d7cfb89c7eb0d0e95e540446daf01e58e2d (
plain) (
blame)
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
|
import Option.none;
import Option.some;
// A very naive implementation of union-find with unsigned integer nodes.
type node = Option.t[uint];
type ufind = rec(mutable vec[mutable node] nodes);
fn make() -> ufind {
let vec[mutable node] v = vec(mutable none[uint]);
Vec.pop(v); // FIXME: botch
ret rec(mutable nodes=v);
}
fn make_set(&ufind ufnd) -> uint {
auto idx = Vec.len(ufnd.nodes);
ufnd.nodes += vec(mutable none[uint]);
ret idx;
}
fn find(&ufind ufnd, uint n) -> uint {
alt (ufnd.nodes.(n)) {
case (none[uint]) { ret n; }
case (some[uint](?m)) {
// TODO: "be"
ret find(ufnd, m);
}
}
}
fn union(&ufind ufnd, uint m, uint n) {
auto m_root = find(ufnd, m);
auto n_root = find(ufnd, n);
auto ptr = some[uint](n_root);
ufnd.nodes.(m_root) = ptr;
}
|