xber9
Новичок
народ привет
есть такая задача реализация алгоритма дейкстры для НЕ взвешанного графа
граф представлен как списки смежности
вот реалиция
я же хочу ввести в списки смежности, веса то есть наример так
$graph = array(
55 => array(60=> array(3)),
60 => array(55=> array(3),74=> array(4)),
74 => array(60=> array(3),75=> array(6)),
...........
но как тогда изменить функцию чтоб дейкстра работал я не представляю
помогите кто может
есть такая задача реализация алгоритма дейкстры для НЕ взвешанного графа
граф представлен как списки смежности
вот реалиция
PHP:
function bfs ($graph, $node, $current) {
$queue[] = array(null,$node);
$marks[$node] = true;
while (count($queue) > 0) {
list($v,$u) = array_shift ($queue);
if (is_callable ($current))
$current ($v,$u);
foreach (get_adjacent ($graph, $u) as $w)
if (!$marks[$w]) {
$marks[$w] = true;
$queue[] = array($u,$w);
}
}
}
$graph = array(
55 => array(60),
60 => array(55,74),
74 => array(60,75),
75 => array(74,76),
76 => array(75,62),
62 => array(76,63),
63 => array(153,62,47),
47 => array(63,48),
48 => array(47,52,53, 152),
152 => array(48,44,24,34),
34 => array(152,33,164, 31),
31 => array(34,32,18),
18 => array(31,113),
113 => array(18,114),
114 => array(113,154, 147),
147 => array(114,150),
150 => array(147,148),
148 => array(150,151),
151 => array(148,149),
149 => array(151),
59 => array(58),
58 => array(59,57),
57 => array(58,73),
73 => array(57,69),
69 => array(73,71),
71 => array(69,70),
70 => array(71,72),
72 => array(70,10),
10 => array(72,7,54),
54 => array(10,53),
53 => array(54,48,52, 42),
);
// адаптер для данной структуры графа
function get_adjacent ($graph, $v) {
return isset($graph[$v]) ? $graph[$v] : array();
}
function print_node ($v, $u) {
if ($v)
echo $v,'->',$u, PHP_EOL;
}
// print all vertices
echo 'Ребра в порядке обхода в ширину:', PHP_EOL;
bfs($graph, 55, 'print_node');
// shortest paths
function dijkstra_visitor ($v, $u) {
global $cost, $path;
if (!isset($cost[$u]) || $cost[$u] > $cost[$v]+1) {
$cost[$u] = $cost[$v]+1;
if ($v)
$path[$u] = $path[$v];
$path[$u][] = $u;
}
}
bfs($graph, 55, 'dijkstra_visitor');
echo PHP_EOL, 'Кратчайший путь из 55 в 164:', PHP_EOL;
var_dump ($path[164]);
$graph = array(
55 => array(60=> array(3)),
60 => array(55=> array(3),74=> array(4)),
74 => array(60=> array(3),75=> array(6)),
...........
но как тогда изменить функцию чтоб дейкстра работал я не представляю
помогите кто может