Я новичок в улучшении библиотеки графов и пытаюсь решить следующую проблему:
В графе (boost :: adjacency_list) у меня есть 3 разных типа вершин (реализованных с использованием std :: варианта) и в настоящее времянеориентированные ребра:
- Разъем (1)
- Switch (2)
- SwitchState (3) - (ON / OFF)
Типичная иерархия в моем графике выглядит следующим образом:
(1a) - (2a) - (1b) - (1d) - (2b) - (1e)
| |
(3a) (3b)
| |
(1c)
Мне нужно найти все достижимые вершины из определенной начальной точки (например, 1a):
1a ->2a -> 1b -> 1d -> 2b -> 1e
Конечно, сразу же приходит на ум просто использование BFS или DFS!: -)
Однако: состояние вершины (2) (переключатель или реле) контролируется состоянием (булево) непосредственно связанной вершины (3).Это означает, что нет пути для перехода от (1a) к (1b) через вершину (2a), если (3a) является (скажем, ложным).И наконец: нельзя переходить от вершин типа (2) к вершинам (3).
Мой вопрос: есть ли у кого-нибудь предложения о том, как эффективно реализовать такой обход графа?Я реализовал это в простом C ++, используя множество векторов / карт и т. Д. И уже в DFS, но хотел бы переместить код в более высокую, более абстрактную (но, надеюсь, все еще эффективную) реализацию базового графа!
I 'Я не уверен, стоит ли мне:
- Использовать фильтр_графа и просто использовать BFS или DFS для обхода?
- Создать тогда под_граф в зависимости от состояния вершин типа 3 и применить BFS / DFS?
- Есть способ достичь этого "на лету" при поиске через BFS / DFSvisitor?
- Другое решение?
Полезные идеи приветствуются!
PS: код используется для имитации электрической сети - на всякий случай.