Пример: у меня есть 20 человек в качестве объекта, и каждый человек знает 0-n других. Направление ссылки имеет значение! Человек А может знать Б, но Б может не знать А. Это ориентированный граф.
Изменить. Для упрощения мои объекты узла (в данном случае объекты Person) могут хранить произвольную информацию. Я знаю, что это не лучший дизайн, но на данный момент это было бы неплохо.
Так что в худшем случае все связаны со всеми, все друг друга знают. Это не реальный вариант использования, но я хочу написать тест для этого, чтобы учиться и играть. В производственной среде количество объектов будет ограничено примерно 20, но способы, которыми эти объекты связаны друг с другом, не ограничены.
Это иллюстрирует проблему в упрощенном виде: спасибо за источник
Учитывая конкретного человека в качестве отправной точки, я хочу пройтись по всему графу и проверить все возможные пути ровно один раз, не застревая в бесконечном цикле.
Представим, что человек А знает Б, который знает С и знает А. Результат может быть таким:
A знает B знает C знает A (хорошо, но мы не хотим заканчиваться бесконечным циклом, поэтому мы остановимся здесь) A знает C знает A A знает T знает R знает V
Это было бы глупо и должно быть устранено: А знает, Б знает, С знает, А знает, С знает, А знает, Т знает, Р знает, В...
У меня есть пара сумасшедших идей, как решить эту проблему. Но...
Вопрос) Должен ли я делать это с итеративным поиском в глубину (IDDFS)?
Джон был так любезен, что указал на DFS в Википедии
Я застрял в этой части статьи:
поиск в глубину, начиная с A, предполагая, что левые ребра в показанном графе выбираются перед правыми ребрами, и предполагая, что поиск запоминает ранее посещенные узлы и не будет их повторять (поскольку это небольшой граф), посетит узлы в следующем порядке: A, B, D, F, E, C, G. Ребра, пройденные в этом поиске, образуют дерево Тремо, структуру с важными приложениями в теории графов.
конкретно это примечание:
"(поскольку это небольшой график)"
Хорошо, а что, если это огромный график?