Я новичок в php, и я делаю проект о неориентированном графе.
Я написал функцию, чтобы узнать кратчайший путь между двумя узлами (A & Г) в этом случае.
код прямо ниже. И я хочу изменить код так, чтобы я мог перечислить все возможные пути между A -G, поэтому я добавляю одну строку в функцию и пытаюсь сделать ее рекурсивной
$this->findTheShortestPath($vertex, $destination);
но получается врезаться в бесконечный цикл. Но я понимаю, почему 🙁 Кто-нибудь знает, что происходит? Или кто-нибудь знает, как изменить код, чтобы он мог перечислить все наши пути?
Спасибо большое
<?PHP
class Graph
{
protected $graph;
protected $visited = array();
public function __construct($graph)
{
$this->graph = $graph;
}// find least number of hops (edges) between 2 nodes
// (vertices)
public function findTheShortestPath($origin, $destination)
{
// mark all nodes as unvisited
foreach ($this->graph as $vertex => $adj) {
$this->visited[$vertex] = false;
}
// create an empty queue
$q = new SplQueue();
// enqueue the origin vertex and mark as visited
$q->enqueue($origin);
$this->visited[$origin] = true;
// this is used to track the path back from each node
$path = array();
$path[$origin] = new SplDoublyLinkedList();
$path[$origin]->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_KEEP);
$path[$origin]->push($origin);
// while queue is not empty and destination not found
// print_r($q);
while (!$q->isEmpty() && $q->bottom() != $destination) {
$t = $q->dequeue();
if (!empty($this->graph[$t])) {
foreach ($this->graph[$t] as $vertex) {
if (!$this->visited[$vertex]) {
$q->enqueue($vertex);
$this->visited[$vertex] = true;
// add vertex to current path
$path[$vertex] = clone $path[$t];
$path[$vertex]->push($vertex);
//$this->findTheShortestPath($vertex, $destination);
}
}
}
}
if (isset($path[$destination])) {
echo "$origin to $destination in ", count($path[$destination]) - 1, " hops \n";
$sep = '';
foreach ($path[$destination] as $vertex) {
echo $sep, $vertex;
$sep = '->';
}
echo "n";
} else {
echo "No route from ", $origin, " to ", $destination, "\n";
}
}}
$graph = array(
'A' => array(
'B',
'C',
'F'
),
'B' => array(
'A',
'C',
'E'
),
'C' => array(
'A',
'B',
'D',
'F'
),
'D' => array(
'C',
'F'
),
'E' => array(
'B',
'F'
),
'F' => array(
'A',
'C',
'D',
'E',
'G'
),
'G' => array(
'F'
)
);
$g = new Graph($graph);
// least number of hops between D and C
$g->findTheShortestPath('A', 'G');
?>
Задача ещё не решена.
Других решений пока нет …