, visited , goal_node ) {
if ( fringe ==?) {
//Цільовий вузол не знайдений
return false;
}
if ( goal_node ? fringe ) {
return true;
}
return BFS '({ child | x ? fringe , child ? expand ( x )} visited , visited ? fringe , goal_node ) ;
}
Ітеративна формулювання:
BFS ( start_node , goal_node ) {
for (all nodes i) visited [ i ]= false;// Спочатку список відвіданих вузлів порожній
queue . push ( start_node );// Починаючи з вузла-джерела
visited [ start_node ]=true;
while (! queue . empty ()) {// поки черга не порожня
node = queue . pop ();// Витягти перший елемент в черзі
if ( node == goal_node ) {
return true;// Перевірити, чи не є поточний вузол цільовим
}
foreach ( child in expand ( node )) {// всі наступники поточного вузла ,.
if (visited [ child ] == false) {//. які ще не були відвідані.
queue . push ( child );//. додати в кінець черги.
visited [ child ]=true;//. і позначити як відвідані
}
}
}
return false;// Цільовий вузол недосяжний
}
2. Схема алгоритму пошуку в ширину
Алгоритм
Пошук в ширину виконується в наступному порядку: початку обходу s приписується мітка 0, суміжним з нею вершин - мітка 1. Потім по черзі розглядається оточення всіх вершин з мітками 1, і кожної з вхідних в ці оточення вершин приписуємо мітку 2 і т.д.
Якщо вихідний граф зв'язний, то пошук в ширину позначить всі його вершини. Дуги виду (i, i + 1) породжують остовно бесконтурний орграф, що містить в якості своєї частини остовное ордерево, зване пошуковим деревом.
Легко побачити, що за допомогою пошуку в ширину можна також занумерувати вершини, нумеруя спочатку вершини з міткою 1, потім з міткою 2 і т.д.
Граф схема алгоритму пошуку в ширину
3. Приклади реалізації
Python
BFS (s, Adj):
level={s: 0}={s: None}=1=[s] frontier:=[] u in frontier: v in Adj [u]: v not in level: [v ]=i [v]=u. append (v)=next +=1
PHP
$ graph=array ( A = gt; array ( B , C , D , Z ), B = gt; array ( A , E ), C = gt; array ( A , F , G ), D = gt; array ( A raquo ;, I ), E = gt; array ( B , H ), F = gt; array ( C , J ), G = gt; array ( C ), H = gt; array ( E , Z ), I = gt; array ( D ), J = gt; array ( J ), Z = gt; array ( A , H )); bfs ($ graph, $ startNode= A )
{
$ visited=array ();
$ queue=array ();
$ queue []=$ graph [$ startNode];
$ visited [$ startNode]=true; (count ($ queue) gt; 0)
{
$ currentNodeAdj=array_pop ($ queue); ($ currentNodeAdj as $ vertex)
{(! array_key_exists ($ vertex, $ visited))
{_ unshift ($ queue, $ graph [$ vertex]);
}
$ visited [$ vertex]=true;
}
}
}
С ++
# include lt; vector gt;
# include lt; stdio. h...