public void RemoveEdge(EdgeDescriptor <V, E> edgeDesciptor) { if (EdgeItems != null) { EdgeItems.Remove(new Tuple <V, V>(edgeDesciptor.Vertex1, edgeDesciptor.Vertex2)); } }
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); }
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); }
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); }
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); } }
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); } }