public ShortestPathSearcher(IGraph <V, E> graph, V source, V target, Func <E, long> getWeight) { if (graph == null) { throw new ArgumentNullException("graph"); } if (!graph.HasVertex(source)) { throw new ArgumentException("source"); } if (!graph.HasVertex(target)) { throw new ArgumentException("target"); } if (DefaultVertexComparer.Equals(source, target)) { throw new ArgumentException("Source and Target are equal"); } Graph = graph; Source = source; Target = target; GetWeight = getWeight; }
public bool VertexIsInPath(V1 nextVertex) { PathNode <V1> node = this; while (node != null) { if (DefaultVertexComparer.Equals(nextVertex, node.Vertex)) { return(true); } node = node.Parent; } return(false); }
protected void MakeStep(PathNode <V> node) { IEnumerable <EdgeDescriptor <V, E> > edgeDescriptors = Graph.AdjacentVertices(node.Vertex); foreach (EdgeDescriptor <V, E> edgeDescriptor in edgeDescriptors) { V nextVertex = edgeDescriptor.GetInvertedVertex(node.Vertex); bool isInverted = !DefaultVertexComparer.Equals(edgeDescriptor.Vertex1, node.Vertex); if (node.VertexIsInPath(nextVertex)) { continue; } if (DefaultVertexComparer.Equals(nextVertex, Target)) { SucceedNodes.Add(new PathNode <V>(nextVertex, node, NodeSearchStatus.Success) { IsInverted = isInverted, Weight = CalctWeight(edgeDescriptor.Edge, node) }); node.Status = NodeSearchStatus.Intermediate; } else { InProgressNodes.Add(new PathNode <V>(nextVertex, node) { IsInverted = isInverted, Weight = CalctWeight(edgeDescriptor.Edge, node) }); node.Status = NodeSearchStatus.Intermediate; } } if (node.Status != NodeSearchStatus.Intermediate) { node.Status = NodeSearchStatus.Fault; } InProgressNodes.Remove(node); }
public bool IsVertex2(V vertex) { return(DefaultVertexComparer.Equals(vertex, Vertex2)); }