-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathDijkstrasAlgorithm.php
43 lines (38 loc) · 1.23 KB
/
DijkstrasAlgorithm.php
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
<?php
namespace App\Chapter7;
class DijkstrasAlgorithm
{
public function searchPath(array $graph, array $costs, array $parents, $processed = [])
{
[$node, $processed] = $this->findLowestCostNode($costs, $processed);
while ($node !== null) {
$cost = $costs[$node];
$neighbors = $graph[$node];
foreach ($neighbors as $key => $neighbor) {
$newCost = $cost + $neighbor;
if ($newCost < $costs[$key]) {
$costs[$key] = $newCost;
$parents[$key] = $node;
}
}
$processed[] = $node;
[$node, $processed] = $this->findLowestCostNode($costs, $processed);
}
return $costs;
}
/*
Найти узел с наименьшей стоимостью
**/
public function findLowestCostNode(array $costs, array $processed)
{
$lowestCost = INF;
$lowestCostNode = null;
foreach ($costs as $node => $cost) {
if ($cost < $lowestCost && !in_array($node, $processed)) {
$lowestCost = $cost;
$lowestCostNode = $node;
}
}
return [$lowestCostNode, $processed];
}
}