public bool TryGetOutEdges(VertexId vertex, out IEnumerable <Edge> edges) { var vertexOutEdges = outEdges[vertex]; edges = vertexOutEdges; return(vertexOutEdges.Count != 0); }
public bool ContainsEdge(VertexId start, VertexId end) { var edges = outEdges[start]; for (int i = 0; i < edges.Count; ++i) { Edge currentEdge = edges[i]; if (currentEdge.EndVertex == end) { return(true); } } return(false); }
private List <VertexId> TopologicalSort(Graph graph) { var vertices = new List <VertexId>(); var inDegrees = new Dictionary <VertexId, int>(); var queue = new Queue <VertexId>(); foreach (VertexId vertex in graph.Vertices) { int inEdgeCount = 0; if (graph.TryGetInEdges(vertex, out IEnumerable <Edge> edges)) { inEdgeCount = edges.Count(); } inDegrees.Add(vertex, inEdgeCount); if (inEdgeCount == 0) { queue.Enqueue(vertex); } } while (queue.Count != 0) { VertexId vertex = queue.Dequeue(); vertices.Add(vertex); if (graph.TryGetOutEdges(vertex, out IEnumerable <Edge> edges)) { foreach (Edge edge in edges) { int inDegree = inDegrees[edge.EndVertex]; if (inDegree > 0) { int newInDegree = inDegree - 1; inDegrees[edge.EndVertex] = newInDegree; if (newInDegree == 0) { queue.Enqueue(edge.EndVertex); } } } } } return(vertices); }
public bool TryGetEdge(VertexId start, VertexId end, out Edge edge) { var edges = outEdges[start]; for (int i = 0; i < edges.Count; ++i) { Edge currentEdge = edges[i]; if (currentEdge.EndVertex == end) { edge = currentEdge; return(true); } } edge = default; return(false); }
public void AddVertex(VertexId vertexId) { inEdges.Add(vertexId, new List <Edge>()); outEdges.Add(vertexId, new List <Edge>()); }
public bool Find(Graph graph, VertexId start, VertexId end, out List <VertexId> vertices, out int distance) { List <VertexId> sortedVertices = TopologicalSort(graph); var lengthTo = new Dictionary <VertexId, int>(); foreach (VertexId vertex in graph.Vertices) { lengthTo.Add(vertex, int.MinValue); } lengthTo[start] = 0; var comeFrom = new Dictionary <VertexId, VertexId>(); for (int i = 0; i < sortedVertices.Count; ++i) { VertexId vertex = sortedVertices[i]; int lengthToVertex = lengthTo[vertex]; if (lengthToVertex != int.MinValue && graph.TryGetOutEdges(vertex, out IEnumerable <Edge> edges)) { foreach (Edge edge in edges) { int lengthWithWeight = lengthToVertex + edge.Weight; if (lengthTo[edge.EndVertex] <= lengthWithWeight) { lengthTo[edge.EndVertex] = lengthWithWeight; comeFrom[edge.EndVertex] = edge.StartVertex; } } } } vertices = new List <VertexId>(); var queue = new Queue <VertexId>(); queue.Enqueue(end); while (queue.Count != 0) { VertexId currentVertex = queue.Dequeue(); vertices.Add(currentVertex); if (currentVertex != start && comeFrom.TryGetValue(currentVertex, out VertexId fromVertex)) { queue.Enqueue(fromVertex); } } vertices.Reverse(); if (vertices.Count == 0 || vertices[0] != start) { distance = 0; return(false); } distance = lengthTo[end]; return(true); }
public bool ContainsVertex(VertexId vertex) { return(outEdges.ContainsKey(vertex)); }