TGViewer
Артём Рыбин | Мэйби Артём Рыбин | Мэйби @maybe_digital · 250 subscribers
Post #51 216
BFS (Breadth-First Search) или поиск в ширину

Основные применения метода поиска в ширину:
- Поиск кратчайшего пути в невзвешенных графах
- Проверка связности графа
- Поиск в лабиринтах и задачах на графы
- Определение уровня узлов в деревьях и графах
- Поиск компонент связности
- Сериализация и десериализация деревьев и графов

Алгоритм:
1.    Начнаем с определения начальной вершины.
2.    Помещаем начальную вершину в очередь и отмечаем ее как посещенную.
3.   Пока очередь не пуста, извлекаем вершину из очереди и проверяем все ее непосещенные соседние вершины.
4.    Добавляем каждую непосещенную соседнюю вершину в очередь и отмечаем ее как посещенную.
5.    Повторяем этот процесс до тех пор, пока не будут посещены все вершины графа или не будет найден целевой элемент.

По времени и памяти у нас O(V + E), где (для временной сложности):
- V — количество вершин (узлов) в графе.
- E — количество рёбер (или связей) в графе

Пример задачи: Найти кратчайший путь от начальной вершины до целевой вершины в графе.
 
package main
 
import (
     "fmt"
)
 
type Graph struct {
     Nodes map[string][]string
}
 
func NewGraph() *Graph {
     return &Graph{
         Nodes: make(map[string][]string),
     }
}
 
func (g *Graph) AddEdge(src, dest string) {
     g.Nodes[src] = append(g.Nodes[src], dest)
     g.Nodes[dest] = append(g.Nodes[dest], src) // для ненаправленного графа
}
 
func BreadthFirstSearch(graph *Graph, start, target string) []string {
     visited := make(map[string]bool)
     queue := make([]string, 0)
     parents := make(map[string]string)
 
     queue = append(queue, start)
     visited[start] = true
 
     for len(queue) > 0 {
         node := queue[0]
         queue = queue[1:]
 
         if node == target {
              path := []string{node}
              for node != start {
                   node = parents[node]
                   path = append([]string{node}, path...)
              }
              return path
         }
 
         for _, neighbor := range graph.Nodes[node] {
              if !visited[neighbor] {
                   visited[neighbor] = true
                   queue = append(queue, neighbor)
                   parents[neighbor] = node
              }
         }
     }
 
     return nil // Целевая вершина не достижима
}
  • 🔥 3
More from @maybe_digital
  1. Sep 22, 2026Ну что, возвращаемся в медиа пространство Новый выпуск из серии подкастов «От кода к бизне…
  2. Sep 12, 2026А кто это у нас тут в отпуске смог пробиться на AI Cases Conf? Когда проект интересный - о…
  3. Sep 3, 2026Поговорили в ТГ и погнали на студию В сотый раз говорю, что безумно благодарен Олегу, за т…
  4. Aug 22, 2026Зашел к Олегу с идей сделать подкаст. В целом, аудиоверсия у нас есть
  5. Aug 21, 2026Не еду на конфу Сегодня общались с программным коммитетом и пришли к тому, что идея классн…
  6. Aug 20, 2026Сегодня был небольшой созвон утром, после которого получило письмо на почту Уважаемый Арте…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →