rust/src/lib/UFind.rs

42 lines
1003 B
Rust
Raw Normal View History

import option.none;
import option.some;
// A very naive implementation of union-find with unsigned integer nodes.
tag node {
elem(uint, option.t[uint]);
}
type ufind = rec(mutable vec[mutable node] nodes);
fn make() -> ufind {
let vec[mutable node] v = vec(mutable elem(0u, none[uint]));
_vec.pop[mutable node](v); // FIXME: botch
ret rec(mutable nodes=v);
}
fn make_set(&ufind ufnd, uint n) {
ufnd.nodes += vec(mutable elem(n, none[uint]));
}
fn find(&ufind ufnd, uint n) -> uint {
alt (ufnd.nodes.(n)) {
case (elem(_, ?parent_opt)) {
alt (parent_opt) {
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) = elem(m_root, ptr);
}