mirror of
https://github.com/trekhleb/javascript-algorithms.git
synced 2025-07-11 14:11:02 +08:00
Add Bellman-Ford.
This commit is contained in:
@ -4,7 +4,68 @@ import Graph from '../../../../data-structures/graph/Graph';
|
|||||||
import bellmanFord from '../bellmanFord';
|
import bellmanFord from '../bellmanFord';
|
||||||
|
|
||||||
describe('bellmanFord', () => {
|
describe('bellmanFord', () => {
|
||||||
it('should find minimum paths to all vertices', () => {
|
it('should find minimum paths to all vertices for undirected graph', () => {
|
||||||
|
const vertexA = new GraphVertex('A');
|
||||||
|
const vertexB = new GraphVertex('B');
|
||||||
|
const vertexC = new GraphVertex('C');
|
||||||
|
const vertexD = new GraphVertex('D');
|
||||||
|
const vertexE = new GraphVertex('E');
|
||||||
|
const vertexF = new GraphVertex('F');
|
||||||
|
const vertexG = new GraphVertex('G');
|
||||||
|
const vertexH = new GraphVertex('H');
|
||||||
|
|
||||||
|
const edgeAB = new GraphEdge(vertexA, vertexB, 4);
|
||||||
|
const edgeAE = new GraphEdge(vertexA, vertexE, 7);
|
||||||
|
const edgeAC = new GraphEdge(vertexA, vertexC, 3);
|
||||||
|
const edgeBC = new GraphEdge(vertexB, vertexC, 6);
|
||||||
|
const edgeBD = new GraphEdge(vertexB, vertexD, 5);
|
||||||
|
const edgeEC = new GraphEdge(vertexE, vertexC, 8);
|
||||||
|
const edgeED = new GraphEdge(vertexE, vertexD, 2);
|
||||||
|
const edgeDC = new GraphEdge(vertexD, vertexC, 11);
|
||||||
|
const edgeDG = new GraphEdge(vertexD, vertexG, 10);
|
||||||
|
const edgeDF = new GraphEdge(vertexD, vertexF, 2);
|
||||||
|
const edgeFG = new GraphEdge(vertexF, vertexG, 3);
|
||||||
|
const edgeEG = new GraphEdge(vertexE, vertexG, 5);
|
||||||
|
|
||||||
|
const graph = new Graph();
|
||||||
|
graph
|
||||||
|
.addVertex(vertexH)
|
||||||
|
.addEdge(edgeAB)
|
||||||
|
.addEdge(edgeAE)
|
||||||
|
.addEdge(edgeAC)
|
||||||
|
.addEdge(edgeBC)
|
||||||
|
.addEdge(edgeBD)
|
||||||
|
.addEdge(edgeEC)
|
||||||
|
.addEdge(edgeED)
|
||||||
|
.addEdge(edgeDC)
|
||||||
|
.addEdge(edgeDG)
|
||||||
|
.addEdge(edgeDF)
|
||||||
|
.addEdge(edgeFG)
|
||||||
|
.addEdge(edgeEG);
|
||||||
|
|
||||||
|
const { distances, previousVertices } = bellmanFord(graph, vertexA);
|
||||||
|
|
||||||
|
expect(distances).toEqual({
|
||||||
|
H: Infinity,
|
||||||
|
A: 0,
|
||||||
|
B: 4,
|
||||||
|
E: 7,
|
||||||
|
C: 3,
|
||||||
|
D: 9,
|
||||||
|
G: 12,
|
||||||
|
F: 11,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(previousVertices.F.getKey()).toBe('D');
|
||||||
|
expect(previousVertices.D.getKey()).toBe('B');
|
||||||
|
expect(previousVertices.B.getKey()).toBe('A');
|
||||||
|
expect(previousVertices.G.getKey()).toBe('E');
|
||||||
|
expect(previousVertices.C.getKey()).toBe('A');
|
||||||
|
expect(previousVertices.A).toBeNull();
|
||||||
|
expect(previousVertices.H).toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should find minimum paths to all vertices for directed graph with negative edge weights', () => {
|
||||||
const vertexS = new GraphVertex('S');
|
const vertexS = new GraphVertex('S');
|
||||||
const vertexE = new GraphVertex('E');
|
const vertexE = new GraphVertex('E');
|
||||||
const vertexA = new GraphVertex('A');
|
const vertexA = new GraphVertex('A');
|
||||||
|
@ -4,7 +4,7 @@ import Graph from '../../../../data-structures/graph/Graph';
|
|||||||
import dijkstra from '../dijkstra';
|
import dijkstra from '../dijkstra';
|
||||||
|
|
||||||
describe('dijkstra', () => {
|
describe('dijkstra', () => {
|
||||||
it('should find minimum paths to all vertices', () => {
|
it('should find minimum paths to all vertices for undirected graph', () => {
|
||||||
const vertexA = new GraphVertex('A');
|
const vertexA = new GraphVertex('A');
|
||||||
const vertexB = new GraphVertex('B');
|
const vertexB = new GraphVertex('B');
|
||||||
const vertexC = new GraphVertex('C');
|
const vertexC = new GraphVertex('C');
|
||||||
@ -64,4 +64,54 @@ describe('dijkstra', () => {
|
|||||||
expect(previousVertices.A).toBeNull();
|
expect(previousVertices.A).toBeNull();
|
||||||
expect(previousVertices.H).toBeNull();
|
expect(previousVertices.H).toBeNull();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should find minimum paths to all vertices for directed graph with negative edge weights', () => {
|
||||||
|
const vertexS = new GraphVertex('S');
|
||||||
|
const vertexE = new GraphVertex('E');
|
||||||
|
const vertexA = new GraphVertex('A');
|
||||||
|
const vertexD = new GraphVertex('D');
|
||||||
|
const vertexB = new GraphVertex('B');
|
||||||
|
const vertexC = new GraphVertex('C');
|
||||||
|
const vertexH = new GraphVertex('H');
|
||||||
|
|
||||||
|
const edgeSE = new GraphEdge(vertexS, vertexE, 8);
|
||||||
|
const edgeSA = new GraphEdge(vertexS, vertexA, 10);
|
||||||
|
const edgeED = new GraphEdge(vertexE, vertexD, 1);
|
||||||
|
const edgeDA = new GraphEdge(vertexD, vertexA, -4);
|
||||||
|
const edgeDC = new GraphEdge(vertexD, vertexC, -1);
|
||||||
|
const edgeAC = new GraphEdge(vertexA, vertexC, 2);
|
||||||
|
const edgeCB = new GraphEdge(vertexC, vertexB, -2);
|
||||||
|
const edgeBA = new GraphEdge(vertexB, vertexA, 1);
|
||||||
|
|
||||||
|
const graph = new Graph(true);
|
||||||
|
graph
|
||||||
|
.addVertex(vertexH)
|
||||||
|
.addEdge(edgeSE)
|
||||||
|
.addEdge(edgeSA)
|
||||||
|
.addEdge(edgeED)
|
||||||
|
.addEdge(edgeDA)
|
||||||
|
.addEdge(edgeDC)
|
||||||
|
.addEdge(edgeAC)
|
||||||
|
.addEdge(edgeCB)
|
||||||
|
.addEdge(edgeBA);
|
||||||
|
|
||||||
|
const { distances, previousVertices } = dijkstra(graph, vertexS);
|
||||||
|
|
||||||
|
expect(distances).toEqual({
|
||||||
|
H: Infinity,
|
||||||
|
S: 0,
|
||||||
|
A: 5,
|
||||||
|
B: 5,
|
||||||
|
C: 7,
|
||||||
|
D: 9,
|
||||||
|
E: 8,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(previousVertices.H).toBeNull();
|
||||||
|
expect(previousVertices.S).toBeNull();
|
||||||
|
expect(previousVertices.B.getKey()).toBe('C');
|
||||||
|
expect(previousVertices.C.getKey()).toBe('A');
|
||||||
|
expect(previousVertices.A.getKey()).toBe('D');
|
||||||
|
expect(previousVertices.D.getKey()).toBe('E');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user