0
Я работаю над проблемой, где мне нужно найти все узлы на расстоянии k друг от друга. Поэтому, если k = 3, то мне нужно найти все узлы, где они соединены путем расстояния 3. Нет собственных ребер, поэтому, если у меня есть ребро, указывающее на s, s не может указывать обратно на i напрямую. Я думаю, что я подумал о двух реализациях здесь, оба с участием BFS. Я заметил крайний случай, когда BFS может не посещать все ребра, потому что узлы уже могут быть посещены.
Делать BFS на каждом узле. Отслеживайте «уровень» каждого узла в некотором массиве, где расстояние [0] является корневым узлом, расстояние1 - это все узлы, смежные с корневым узлом, расстояние [2] - все узлы, которые являются внуками корневого узла и т. Д. на. Затем, чтобы найти все узлы на расстоянии k, мы смотрим на расстояние [i] и расстояние [i + k].
Делаем BFS один раз, используя тот же алгоритм расстояния, что и выше, но не делаем BFS на каждом узле,Переверните все ребра и снова выполните BFS, чтобы найти пропущенные пути. Это могло бы иметь намного лучшую временную сложность, чем подход 1, но я не уверен, будет ли он на самом деле исследовать все ребра и пути (в моих тестовых примерах это казалось).
Есть ли лучший подход к этому? В качестве примера на этом графике с k = 2:
Пути будут от 1 до 3, от 1 до 5, от 2 до 6, от 2 до5, 4–3, 1–4.
РЕДАКТИРОВАТЬ: инверсия ребер не будет работать, моя лучшая ставка на данный момент - просто сделать BFS, а затем DFS на каждом узле, пока не будет достигнута глубина k.