[Грокаем алгоритмы] Алгоритм поиска в ширину на C# (BFS)

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Всем читающим эту статью здрасте. Сегодня я хотел бы поделиться с вами своей реализацией поиска в ширину (BFS) на C#.

Негативные комментарии, касающиеся моего говнокода и реализации поддерживаются. Настоятельно рекомендую вам высказаться по поводу всего. Я начинающий, поэтому думаю, что это даже к лучшему.

Для начала я хотел бы кратко ознакомить вас с принципом работы моего кода

Что к чему?

Итак, изначально я создал класс под названием BFS:

class BFS{
  
}

Далее я начал создавать такие поля и свойства, как:

  • Начальное значение (StartValue)

  • Конечное значение (GoalValue)

  • Словарь с вершинами (Graph)

  • Очередь (Queue)

  • И проверенные значения (UsedValues)

class BFS
    {
        private string _startValue;
        public string StartValue { 
            get { return _startValue; } 
            set { _startValue = value; }
        }

        private string _goalValue;
        public string GoalValue
        {
            get { return _goalValue; }
            set { _goalValue = value; }
        }

        private Dictionary<string, string[]> _graph = new Dictionary<string, string[]>();
        public Dictionary<string, string[]> Graph
        {
            get { return _graph; }
            set { _graph = value; }
        }

        private Queue<string> _queue = new Queue<string>();
        public Queue<string> Queue
        {
            get { return _queue; }
            set { _queue = value; }
        }

        private List<string> _usedValues = new List<string>();
        public List<string> UsedValues
        {
            get { return _usedValues; }
            set { _usedValues = value; }
        }
}

Объявил конструктор класса:

public BFS(string startValue, string goalValue, Dictionary<string, string[]> graph)
{
  StartValue = startValue;
  GoalValue = goalValue;
  Graph = graph;
}

Создал метод поиска кратчайшего пути:

public void Search()
{
  Queue.Enqueue(StartValue);

  while (Queue.Count != 0)
  {
    string node = Queue.Dequeue();
    string[] vertites = Graph[node];

    if (node == GoalValue)
    {
      return;
    }

    foreach (string vertite in vertites)
    {
      if (!UsedValues.Contains(vertite))
      {
        if (vertite == GoalValue)
        {
          if (Queue.Count > 0)
          {
            Queue.Dequeue();
          }
          Queue.Enqueue(node);
          Queue.Enqueue(GoalValue);
          return;
        }
        Queue.Enqueue(vertite);

      }

    }
    UsedValues.Add(node);
  }
}

И, наконец, метод вывода кратчайшего пути:

public void ShortestWay()
{
    Search();

    Console.Write($"{StartValue} ");
    foreach (string value in Queue)
    {
      Console.Write($"--> {value} ");
    }
}

Работа программы

За основу возьмем вот такой вот граф:

Кратчайший путь от A до B равен А -> P -> B

Запускаем программу, и получаем такой же вывод

Заключение

На этом в принципе можно и заканчивать. Кто дочитал до конца, тому я сильно благодарен. Поддерживаю критику в сторону моего кода, приму все во внимание

Кто хочет скачать код, держите ссылку на GitHub.

Источник: https://habr.com/ru/post/674686/


Интересные статьи

Интересные статьи

Всех приветствую! Меня зовут Сергей и я алкоголик практикующий психолог. После предыдущих статей на сугубо психологическую и околопсихологическую тематику мне задали вопрос "а что же ты сюда пришёл? В...
Выгрузка пользователей из 1C ЗУП в Битрикс24 или правдивая история о том как настроить интеграцию 1С-Битрикс24 с ЗУП без 1С-ника В жизни так бывает, причём бывает чаще чем хотелось б...
Кибергруппировка APT30 известна довольно давно – еще в 2015 году ее активность описывали наши коллеги из FireEye. Участники этой группы обычно атакуют государственные структуры в Юж...
Принято считать, что персонализация в интернете это магия, которая создается сотнями серверов на основе БигДата и сложного семантического анализа контента.
Привет, Хаброжители! Маркос Лопез де Прадо делится тем, что обычно скрывают, — самыми прибыльными алгоритмами машинного обучения, которые он использовал на протяжении двух десятилетий, чтобы упр...