Найти все возможные пути в неориентированном графе между двумя узлами

Я новичок в 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');

?>

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]