예제 #1
0
 public void Add(KeyNode node)
 {
     HeapArray[currentIndex] = node;
     IndexeMap[node.Index]   = currentIndex;
     HeapifyUp(currentIndex);
     ++currentIndex;
 }
예제 #2
0
        public KeyNode ExtractMin()
        {
            KeyNode minNode = null;

            if (Size > 0)
            {
                Swap(0, Size - 1);
                minNode = HeapArray[Size - 1];
                --Size;
                Heapify(0);
            }
            return(minNode);
        }
예제 #3
0
        static void PrimsAlgorithm(int v)
        {
            int[] Parent = new int[v];
            Parent[0] = -1;

            MinHeapMap PriorityQueue = new MinHeapMap(v);

            var keyNode = new KeyNode {
                Weight = 0, Index = 0
            };

            PriorityQueue.Add(keyNode);

            for (int i = 1; i < v; i++)
            {
                Parent[i] = -1;
                keyNode   = new KeyNode {
                    Weight = int.MaxValue, Index = i
                };
                PriorityQueue.Add(keyNode);
            }

            while (PriorityQueue.Size > 0)
            {
                KeyNode Node       = PriorityQueue.ExtractMin();
                var     childNodes = graph.adj[Node.Index];

                foreach (var childNode in childNodes)
                {
                    int ReferenceWeight = PriorityQueue.GetWeight(childNode.Index);
                    int OriginalWeight  = childNode.Weight;

                    if (PriorityQueue.Contains(childNode.Index) && ReferenceWeight > OriginalWeight)
                    {
                        PriorityQueue.Update(childNode.Index, OriginalWeight);
                        Parent[childNode.Index] = Node.Index;
                    }
                }
            }
            for (int i = 0; i < v; i++)
            {
                Console.WriteLine(Parent[i] + " is Parent of" + "Index: " + i);
            }
        }