示例#1
0
        private int Prim(WeightedNode <T> source, List <WeightedEdge <T> > listEdge, ref int count)
        {
            source.IsSeen = true;

            foreach (var item in source.Edges)
            {
                if (!item.Node.IsSeen)
                {
                    listEdge.Add(item);
                }
            }

            if (listEdge.Count == 0)
            {
                return(0);
            }

            WeightedEdge <T> tempEdge = listEdge[0];
            WeightedNode <T> tempNode = listEdge[0].Node;
            int tempCount             = 0;

            for (int i = 0; i < listEdge.Count; i++)
            {
                if (!listEdge[i].Node.IsSeen && listEdge[i].Weight <= tempEdge.Weight)
                {
                    tempEdge  = listEdge[i];
                    tempNode  = listEdge[i].Node;
                    tempCount = listEdge[i].Weight;
                }
                else if (listEdge[i].Node.IsSeen)
                {
                    listEdge.RemoveAt(i);
                }
            }

            listEdge.Remove(tempEdge);
            count += tempCount;

            if (tempNode != null)
            {
                Prim(tempNode, listEdge, ref count);
            }

            return(count);
        }
示例#2
0
        public void Connect(T v1, T v2, int weight)
        {
            WeightedNode <T> node1 = null;
            WeightedNode <T> node2 = null;

            foreach (var item in Vertices)
            {
                if (v1.Equals(item.Value))
                {
                    node1 = item;
                }
                if (v2.Equals(item.Value))
                {
                    node2 = item;
                }
            }

            if (node1 == null)
            {
                node1 = new WeightedNode <T>(v1);
                Vertices.Add(node1);
                Count++;
            }
            if (node2 == null)
            {
                node2 = new WeightedNode <T>(v2);
                Vertices.Add(node2);
                Count++;
            }

            WeightedEdge <T> node1Edge = new WeightedEdge <T>(weight, node2);
            WeightedEdge <T> node2Edge = new WeightedEdge <T>(weight, node1);

            node1.Edges.Add(node1Edge);
            node2.Edges.Add(node2Edge);
        }