У меня есть файл данных с пересечениями (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 должна обрабатывать две статистики для пробежек, в том числе:
Средняя безопасность пути: средний индекс безопасности всех пересечений на беговой дорожке.
Минимальная безопасность пути: минимальный индекс безопасности всех пересечений на беговой дорожке.
Если вы хотите реализовать DFS на графике, вам нужен способ отметить вершины, которые уже были посещены. Вы можете изменить свою структуру вершин, чтобы включить флаг, или иметь отдельный битовый вектор, который перегруппирует все флаги вместе.
Для алгоритма DFS это довольно просто:
Это базовая линия. Вы можете превратить этот алгоритм в цикл (вместо рекурсии), используя стек.
В вашем задании вам придется что-то делать на каждом этапе DFS, поэтому вам нужно выяснить, как это делать.
Подсказка: создайте класс, который работает с DFS на графике, и выведите этот класс для реализации дополнительных вещей.
Вторая часть вашей проблемы связана не с DFS, а с обработкой результата вашего поиска, пробежки, которая представляет собой список вершин.
Других решений пока нет …