Use Infinity instead of zero in Graph adjacency matrix to show that vertices are not connected.

This commit is contained in:
Oleksii Trekhleb 2018-05-22 07:10:46 +03:00
parent f966ef5d5d
commit 3e0ac7486c
3 changed files with 14 additions and 15 deletions

View File

@ -15,7 +15,7 @@ function isSafe(adjacencyMatrix, verticesIndices, cycle, vertexCandidate) {
const endVertexAdjacencyIndex = verticesIndices[endVertex.getKey()]; const endVertexAdjacencyIndex = verticesIndices[endVertex.getKey()];
// Check if last vertex in the path and candidate vertex are adjacent. // Check if last vertex in the path and candidate vertex are adjacent.
if (!adjacencyMatrix[endVertexAdjacencyIndex][candidateVertexAdjacencyIndex]) { if (adjacencyMatrix[endVertexAdjacencyIndex][candidateVertexAdjacencyIndex] === Infinity) {
return false; return false;
} }
@ -43,7 +43,7 @@ function isCycle(adjacencyMatrix, verticesIndices, cycle) {
const endVertexAdjacencyIndex = verticesIndices[endVertex.getKey()]; const endVertexAdjacencyIndex = verticesIndices[endVertex.getKey()];
// Check if we can go from end vertex to the start one. // Check if we can go from end vertex to the start one.
return !!adjacencyMatrix[endVertexAdjacencyIndex][startVertexAdjacencyIndex]; return adjacencyMatrix[endVertexAdjacencyIndex][startVertexAdjacencyIndex] !== Infinity;
} }
/** /**

View File

@ -177,18 +177,17 @@ export default class Graph {
const vertices = this.getAllVertices(); const vertices = this.getAllVertices();
const verticesIndices = this.getVerticesIndices(); const verticesIndices = this.getVerticesIndices();
// Init matrix with zeros. // Init matrix with infinities meaning that there is no ways of
// getting from one vertex to another yet.
const adjacencyMatrix = Array(vertices.length).fill(null).map(() => { const adjacencyMatrix = Array(vertices.length).fill(null).map(() => {
return Array(vertices.length).fill(0); return Array(vertices.length).fill(Infinity);
}); });
// Fill the columns. // Fill the columns.
vertices.forEach((vertex, vertexIndex) => { vertices.forEach((vertex, vertexIndex) => {
vertex.getNeighbors().forEach((neighbor) => { vertex.getNeighbors().forEach((neighbor) => {
const neighborIndex = verticesIndices[neighbor.getKey()]; const neighborIndex = verticesIndices[neighbor.getKey()];
adjacencyMatrix[vertexIndex][neighborIndex] = this.isDirected ? adjacencyMatrix[vertexIndex][neighborIndex] = this.findEdge(vertex, neighbor).weight;
this.findEdge(vertex, neighbor).weight :
1;
}); });
}); });

View File

@ -348,10 +348,10 @@ describe('Graph', () => {
const adjacencyMatrix = graph.getAdjacencyMatrix(); const adjacencyMatrix = graph.getAdjacencyMatrix();
expect(adjacencyMatrix).toEqual([ expect(adjacencyMatrix).toEqual([
[0, 1, 0, 0], [Infinity, 0, Infinity, Infinity],
[1, 0, 1, 1], [0, Infinity, 0, 0],
[0, 1, 0, 1], [Infinity, 0, Infinity, 0],
[0, 1, 1, 0], [Infinity, 0, 0, Infinity],
]); ]);
}); });
@ -375,10 +375,10 @@ describe('Graph', () => {
const adjacencyMatrix = graph.getAdjacencyMatrix(); const adjacencyMatrix = graph.getAdjacencyMatrix();
expect(adjacencyMatrix).toEqual([ expect(adjacencyMatrix).toEqual([
[0, 2, 0, 0], [Infinity, 2, Infinity, Infinity],
[0, 0, 1, 7], [Infinity, Infinity, 1, 7],
[0, 0, 0, 5], [Infinity, Infinity, Infinity, 5],
[0, 0, 0, 0], [Infinity, Infinity, Infinity, Infinity],
]); ]);
}); });
}); });