-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path08_algorithm_dijkstra.js
126 lines (122 loc) · 4.1 KB
/
08_algorithm_dijkstra.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
const graph = {};
graph.a = {b: 2, c: 1};
graph.b = {f: 7};
graph.c = {d: 5, e: 2};
graph.d = {f: 2};
graph.e = {f: 1};
graph.f = {g: 1};
graph.g = {};
function shortPath(graph, start, end) {
const costs = {};
const processed = [];
let neighbors = {};
Object.keys(graph).forEach(node => {
if (node !== start) {
let value = graph[start][node];
costs[node] = value || 100000000;
}
});
let node = findNodeLowestCost(costs, processed);
while (node) {
const cost = costs[node];
neighbors = graph[node];
Object.keys(neighbors).forEach(neighbor => {
let newCost = cost + neighbors[neighbor];
if (newCost < costs[neighbor]) {
costs[neighbor] = newCost;
}
});
processed.push(node);
node = findNodeLowestCost(costs, processed);
}
return costs;
}
function findNodeLowestCost(costs, processed) {
let lowestCost = 100000000;
let lowestNode;
Object.keys(costs).forEach(node => {
let cost = costs[node];
console.log({
node,
cost,
costs
})
if (cost < lowestCost && !processed.includes(node)) {
lowestCost = cost;
lowestNode = node;
}
})
return lowestNode;
}
console.log(shortPath(graph, 'a', 'a'));
// ----------------------------------------------------------
// function dijkstra(graph, start) {
// const distances = {}; // храним кратчайшие расстояния до всех узлов
// const visited = new Set(); // посещенные узлы
// const queue = new PriorityQueue(); // очередь с приоритетом
//
// // Инициализируем расстояния
// for (let node in graph) {
// distances[node] = Infinity; // изначально все расстояния бесконечные
// }
// distances[start] = 0; // расстояние до стартового узла = 0
// queue.enqueue(start, 0);
//
// // Основной цикл
// while (!queue.isEmpty()) {
// const { node: current } = queue.dequeue(); // текущий узел с минимальной дистанцией
//
// if (visited.has(current)) continue; // если узел уже обработан, пропускаем
// visited.add(current);
//
// // Обрабатываем соседей текущего узла
// for (let neighbor in graph[current]) {
// let weight = graph[current][neighbor]; // вес ребра
// let distance = distances[current] + weight; // потенциальное новое расстояние
//
// // Если нашли более короткий путь, обновляем
// if (distance < distances[neighbor]) {
// distances[neighbor] = distance;
// queue.enqueue(neighbor, distance); // добавляем в очередь с новым приоритетом
// }
// }
// }
//
// return distances; // возвращаем кратчайшие расстояния до всех узлов
// }
//
// // Очередь с приоритетом для алгоритма Дейкстры
// class PriorityQueue {
// constructor() {
// this.values = [];
// }
//
// enqueue(node, priority) {
// this.values.push({ node, priority });
// this.sort();
// }
//
// dequeue() {
// return this.values.shift();
// }
//
// isEmpty() {
// return this.values.length === 0;
// }
//
// sort() {
// this.values.sort((a, b) => a.priority - b.priority); // сортируем по приоритету (минимальный — первый)
// }
// }
//
// // Пример графа
// const graph = {
// A: { B: 1, C: 4 },
// B: { A: 1, C: 2, D: 5 },
// C: { A: 4, B: 2, D: 1 },
// D: { B: 5, C: 1 }
// };
//
// // Запуск алгоритма Дейкстры
// const startNode = 'A';
// console.log(dijkstra(graph, startNode));