Ejemplo n.º 1
0
 public void RemoveEdge(EdgeDescriptor <V, E> edgeDesciptor)
 {
     if (EdgeItems != null)
     {
         EdgeItems.Remove(new Tuple <V, V>(edgeDesciptor.Vertex1, edgeDesciptor.Vertex2));
     }
 }
Ejemplo n.º 2
0
        public IEnumerable <EdgeDescriptor <V, E> > FindShortestPath()
        {
            RootNode        = new PathNode <V>(Source);
            SucceedNodes    = new List <PathNode <V> >();
            InProgressNodes = new List <PathNode <V> >()
            {
                RootNode
            };

            while (InProgressNodes.Any())
            {
                InProgressNodes.ToList().ForEach(node => MakeStep(node));
            }

            // [DM] Enumerable.OrderBy is a stable sort that preserve original positions for equal items
            PathNode <V> foundNode = SucceedNodes.OrderBy(n => n, PathNodesComparisonInstance).FirstOrDefault();

            List <EdgeDescriptor <V, E> > path = new List <EdgeDescriptor <V, E> >();

            while (foundNode != null)
            {
                if (foundNode.Parent != null)
                {
                    EdgeDescriptor <V, E> descriptor = foundNode.IsInverted
                        ? Graph.FindEdgeDescriptor(foundNode.Vertex, foundNode.Parent.Vertex)
                        : Graph.FindEdgeDescriptor(foundNode.Parent.Vertex, foundNode.Vertex);
                    path.Insert(0, descriptor);
                }

                foundNode = foundNode.Parent;
            }
            return(path);
        }
Ejemplo n.º 3
0
        public void AddEdge(V vertex1, V vertex2, E edge)
        {
            VertexDescriptor <V, E> vertexDescriptor1, vertexDescriptor2;

            if (!Vertices.TryGetValue(vertex1, out vertexDescriptor1))
            {
                throw new InvalidOperationException(String.Format("Could not find vertex '{0}'", vertex1));
            }

            EdgeDescriptor <V, E> edgeDesciptor;

            if (vertexDescriptor1.TryFindEdge(vertex1, vertex2, out edgeDesciptor))
            {
                throw new InvalidOperationException(String.Format("The edge for '{0}' and '{1}' is already exists", vertex1, vertex2));
            }

            if (!Vertices.TryGetValue(vertex2, out vertexDescriptor2))
            {
                throw new InvalidOperationException(String.Format("Could not find vertex '{0}'", vertex2));
            }

            edgeDesciptor = new EdgeDescriptor <V, E>(vertex1, vertex2, edge);
            Edges.Add(edgeDesciptor);
            vertexDescriptor1.AddEdge(edgeDesciptor);
            vertexDescriptor2.AddEdge(edgeDesciptor);
        }
Ejemplo n.º 4
0
        public void AddEdge(EdgeDescriptor <V, E> edgeDesciptor)
        {
            if (EdgeItems == null)
            {
                EdgeItems = new SortedDictionary <Tuple <V, V>, EdgeDescriptor <V, E> >();
            }

            edgeDesciptor.GetInvertedVertex(Vertex); // Validate whether any of edge's vertices are equal to this vertex
            EdgeItems.Add(new Tuple <V, V>(edgeDesciptor.Vertex1, edgeDesciptor.Vertex2), edgeDesciptor);
        }
Ejemplo n.º 5
0
 public bool TryFindEdge(V vertex1, V vertex2, out EdgeDescriptor <V, E> edgeDesciptor)
 {
     if (EdgeItems != null)
     {
         return(EdgeItems.TryGetValue(new Tuple <V, V>(vertex1, vertex2), out edgeDesciptor));
     }
     else
     {
         edgeDesciptor = default(EdgeDescriptor <V, E>);
         return(false);
     }
 }
Ejemplo n.º 6
0
        private void AddOrUpdateVertex(EdgeDescriptor <V, E> edgeDescriptor, V v)
        {
            VertexDescriptor <V, E> vertexDescriptor;

            if (!Vertices.ContainsKey(v))
            {
                vertexDescriptor = new VertexDescriptor <V, E>(v);
                vertexDescriptor.AddEdge(edgeDescriptor);
                Vertices.Add(v, vertexDescriptor);
            }
            else
            {
                Vertices[v].AddEdge(edgeDescriptor);
            }
        }