/// <summary> /// Обход в ширину (вниз, по направлению к источнику) /// </summary> /// <param name="start">Начало обхода</param> /// <param name="processVertex">(int vertexID) => bool. Если возвращает false, то обход заканчивается и BFS возвращает vertexID </param> /// <param name="processAdjacent">(v, a) => bool. Если возвращает false, то вершина a не добавляется в очередь и обход в направлении v->a не идет</param> /// <returns>Точка, на которой законечен обход</returns> public static int BFSUp <TVertex, TEdge>(IDirectedNetwork <TVertex, TEdge> network, int start, Func <int, bool> processVertex, Func <int, int, bool> processAdjacent) { int current = start; HashSet <int> visited = new HashSet <int>(); Queue <int> q = new Queue <int>(); q.Enqueue(start); visited.Add(start); while (q.Count != 0) { current = q.Dequeue(); if (processVertex(current)) { return(current); } foreach (int adj in network.getPredecessors(current)) { if (!visited.Contains(adj)) { if (processAdjacent(current, adj)) { q.Enqueue(adj); } visited.Add(adj); } } } return(-1); }
private bool testArmTask(IDirectedNetwork <CommonJunction, CommonJunction> network, IDirectedNetwork <CommonJunction, CommonJunction> expected_result, int edgeID) { DirectedNetworkTracer tracer = new DirectedNetworkTracer(network); IDirectedNetwork <CommonJunction, CommonJunction> result = tracer.armTask(edgeID).network; return(compareNetworks(result, expected_result)); }
protected bool compareNetworks <TVertex, TEdge>(IDirectedNetwork <TVertex, TEdge> n1, IDirectedNetwork <TVertex, TEdge> n2) { bool equal_vertexes = compareCollections(n1.Vertexes.Select(x => x.id), n2.Vertexes.Select(x => x.id)); bool equal_edges = compareCollections(n1.Edges.Select(x => x.id), n2.Edges.Select(x => x.id)); if (equal_edges && equal_vertexes) { return(true); } return(false); }
private bool testArmExample(string name, int EdgeID) { yEdDirectedNetwork network = new yEdDirectedNetwork(); network.setSymbols(this.symbols_to_classes); network.loadFromXml(this.getExample(name)); DirectedNetworkTracer tracer = new DirectedNetworkTracer(network); yEdDirectedNetwork expected_result = new yEdDirectedNetwork(); expected_result.setSymbols(this.symbols_to_classes); expected_result.loadFromXml(this.getExample(name + "_result")); IDirectedNetwork <CommonJunction, CommonJunction> result = tracer.armTask(EdgeID).network; return(compareNetworks(result, expected_result)); }
public static int BFSDownMultipleSources <TVertex, TEdge>(IDirectedNetwork <TVertex, TEdge> network, int[] sources, Func <int, bool> processVertex, Func <int, int, bool> processAdjacent) { if (sources.Length == 0) { return(-1); } int current = sources.First(); HashSet <int> visited = new HashSet <int>(); Queue <int> q = new Queue <int>(); foreach (int v in sources) { q.Enqueue(v); visited.Add(v); } while (q.Count != 0) { current = q.Dequeue(); if (processVertex(current)) { return(current); } foreach (int adj in network.getSuccessors(current)) { if (!visited.Contains(adj)) { if (processAdjacent(current, adj)) { q.Enqueue(adj); } visited.Add(adj); } } } return(current); }
public DirectedNetworkTracer(IDirectedNetwork <CommonJunction, CommonJunction> network) { this.network = network; }