//虽然代码少,思想和不简单 public DisjointSetNode <T> Find(DisjointSetNode <T> node) { if (node != node.Parent) { node.Parent = Find(node.Parent); } return(node.Parent); }
public DisjointSet(T value) { var node = new DisjointSetNode <T>(); node.Value = value; node.Parent = node; node.Rank = 0; _nodes.Add(node.Value, node); Delegate = node; }
private DisjointSetNode <T> Link(DisjointSetNode <T> first, DisjointSetNode <T> second) { if (first.Rank > second.Rank) { second.Parent = first; return(first); } first.Parent = second; if (first.Rank == second.Rank) { second.Rank = second.Rank + 1; } return(second); }
public DisjointSet <T> Union(DisjointSet <T> set) { var newdelegate = Link(Find(Delegate), Find(set.Delegate)); //消灭旧的DisjointSet,而不是创建全新的Set //虽然它们的引用还是不一样,但是Delegate和node是完全一样的。 Delegate = newdelegate; set.Delegate = newdelegate; foreach (var item in set._nodes) { _nodes.Add(item); } set._nodes = _nodes; return(this); }