алгоритм — Использование поиска в глубину в графе c ++

У меня есть файл данных с пересечениями (ID Safety Name) и улицами (Intersection1 Intersection2 distance), как показано:

INTERSECTIONS:
198 0.8 alvemon and 28th
199 0.6 alvemon and 29th
200 0.8 alvemon and 30th

STREETS:
1   2   0.6
2   3   0.1
3   4   0.9

Пересечения — это вершины, а улицы — это края. Вот мои заголовки:
Заголовок вершины:

#ifndef VERTEX_H
#define VERTEX_H
#include<list>
#include<string>
#include "global.h"
struct Vertex_{
int xsect;
double danger;
std::string xstreets;

std::list<Edge> EdgeList;
/*struct Vertex_ *next;
struct Vertex_ *prev;*/
};

#endif

Краевой заголовок:

#ifndef EDGE_H
#define EDGE_H

#include "global.h"#include "vertex.h"struct Edge_{
Vertex *adjvertex;
double distance;

/*struct edge *next;
struct edge *prev;*/
};

#endif

Я делаю график из списков. У меня уже есть все это настроено, и я сделал график (или карту) улиц / перекрестков. Я знаю, что мне нужно использовать поиск в глубину из-за требований ниже, но не знаю, как реализовать. Если бы кто-нибудь мог привести мне пример поиска в глубину, это было бы здорово. Теперь мое назначение требует от меня:

Требования к беговой дорожке

Программа safejogger должна выполнить поиск по предоставленному графику, чтобы найти пути бега, которые отвечают следующим требованиям:
Путь должен начинаться и заканчиваться в том же пересечении (то есть, в вершине), указанном пользователем, указанным начальным интервалом.
Путь не должен пересматривать пересечения. Другими словами, ни одна вершина не должна появляться дважды внутри пути.
Общая длина пути должна составлять 1 милю от заданного пользователем целевого расстояния.

Беговая дорожка Безопасность

Программа safejogger должна обрабатывать две статистики для пробежек, в том числе:
Средняя безопасность пути: средний индекс безопасности всех пересечений на беговой дорожке.
Минимальная безопасность пути: минимальный индекс безопасности всех пересечений на беговой дорожке.

0

Решение

Если вы хотите реализовать DFS на графике, вам нужен способ отметить вершины, которые уже были посещены. Вы можете изменить свою структуру вершин, чтобы включить флаг, или иметь отдельный битовый вектор, который перегруппирует все флаги вместе.

Для алгоритма DFS это довольно просто:

  • Вы отмечаете вершину, с которой начинаете,
  • Вы следуете за каждым краем, оставляя это,
  • если конечная вершина еще не отмечена, вы рекурсивно запускаете алгоритм DFS.

Это базовая линия. Вы можете превратить этот алгоритм в цикл (вместо рекурсии), используя стек.

В вашем задании вам придется что-то делать на каждом этапе DFS, поэтому вам нужно выяснить, как это делать.
Подсказка: создайте класс, который работает с DFS на графике, и выведите этот класс для реализации дополнительных вещей.

Вторая часть вашей проблемы связана не с DFS, а с обработкой результата вашего поиска, пробежки, которая представляет собой список вершин.

0

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

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

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