예제 #1
0
 //虽然代码少,思想和不简单
 public DisjointSetNode <T> Find(DisjointSetNode <T> node)
 {
     if (node != node.Parent)
     {
         node.Parent = Find(node.Parent);
     }
     return(node.Parent);
 }
예제 #2
0
        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;
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }