From f8a84c278b0f66750dec833bbd5fd7adf0e32f73 Mon Sep 17 00:00:00 2001 From: AmirMohammad Hosseini Nasab Date: Sat, 30 Jul 2022 15:09:42 +0430 Subject: [PATCH 1/2] Add test for graph reverse with cycle of length two --- .../graph/__test__/Graph.test.js | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/data-structures/graph/__test__/Graph.test.js b/src/data-structures/graph/__test__/Graph.test.js index 936a69b8..bc0f17e3 100644 --- a/src/data-structures/graph/__test__/Graph.test.js +++ b/src/data-structures/graph/__test__/Graph.test.js @@ -305,6 +305,35 @@ describe('Graph', () => { expect(graph.getNeighbors(vertexD)[0].getKey()).toBe(vertexC.getKey()); }); + it('should be possible to reverse directed graph with cycle of lenght two', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeBA = new GraphEdge(vertexB, vertexA); + + const graph = new Graph(true); + graph + .addEdge(edgeAB) + .addEdge(edgeBA); + + expect(graph.toString()).toBe('A,B'); + expect(graph.getAllEdges().length).toBe(2); + expect(graph.getNeighbors(vertexA).length).toBe(1); + expect(graph.getNeighbors(vertexA)[0].getKey()).toBe(vertexB.getKey()); + expect(graph.getNeighbors(vertexB).length).toBe(1); + expect(graph.getNeighbors(vertexB)[0].getKey()).toBe(vertexA.getKey()); + + graph.reverse(); + + expect(graph.toString()).toBe('A,B'); + expect(graph.getAllEdges().length).toBe(2); + expect(graph.getNeighbors(vertexA).length).toBe(1); + expect(graph.getNeighbors(vertexA)[0].getKey()).toBe(vertexB.getKey()); + expect(graph.getNeighbors(vertexB).length).toBe(1); + expect(graph.getNeighbors(vertexB)[0].getKey()).toBe(vertexA.getKey()); + }); + it('should return vertices indices', () => { const vertexA = new GraphVertex('A'); const vertexB = new GraphVertex('B'); From ede3b37825d67b0296edc64405c2ecff64040129 Mon Sep 17 00:00:00 2001 From: AmirMohammad Hosseini Nasab Date: Sat, 30 Jul 2022 15:10:21 +0430 Subject: [PATCH 2/2] Fix graph reverse method --- src/data-structures/graph/Graph.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/data-structures/graph/Graph.js b/src/data-structures/graph/Graph.js index ba0b6d01..cd42fd31 100644 --- a/src/data-structures/graph/Graph.js +++ b/src/data-structures/graph/Graph.js @@ -138,6 +138,7 @@ export default class Graph { */ reverse() { /** @param {GraphEdge} edge */ + const reversedEdges = []; this.getAllEdges().forEach((edge) => { // Delete straight edge from graph and from vertices. this.deleteEdge(edge); @@ -145,7 +146,11 @@ export default class Graph { // Reverse the edge. edge.reverse(); - // Add reversed edge back to the graph and its vertices. + // Add reversed edge to the list of reversed edges. + reversedEdges.push(edge); + }); + reversedEdges.forEach((edge) => { + // Add reversed edge to the graph. this.addEdge(edge); });