Есть несколько вещей, которые вы можете рассмотреть.Во-первых, статические переменные на уровне функций, как правило, не очень хорошая идея, вы, вероятно, можете изменить дизайн и сделать их либо обычными переменными (за счет дополнительных выделений), либо членами-экземплярами и поддерживать их.
Функция предполагаетчто матрица смежности является квадратной, но код инициализации не отображается, поэтому ее следует проверить.Предположение может быть удалено путем выполнения условия внутреннего цикла adj_matrix[v].size()
(с учетом узла v
) или, если это инвариант, добавьте утверждение перед этим внутренним циклом: assert( adj_matrix[v].size() == adj_matrix.size() && "adj_matrix is not square!" );
- то же самое относится и к члену size
и размер adj_matrix
сам по себе.
Весь алгоритм кажется более сложным, чем следует, DFS, начинающаяся с узла v, имеет общую форму:
dfs( v )
set visited[ v ]
operate on node (print node label...)
for each node reachable from v:
if not visited[ node ]:
dfs( node )
Ваш алгоритм, кажется (неправильно кстати) пересекает график в противоположном направлении.Вы устанавливаете данный узел как visited
, а затем пытаетесь найти любой узел, который является начальной точкой ребра этого узла.То есть вместо следующих узлов достижимый из v
вы пытаетесь получить узлы, для которых v
достижимо.Если это так (то есть, если целью является печать всех путей, которые сходятся в v
), то вы должны быть осторожны, чтобы не попасть в одно и то же ребро дважды, иначе вы попадете в бесконечный цикл -> stackoverflow.
Чтобы увидеть, что вы закончите stackoverlow, рассмотрите этот пример.Начальный узел - 1
.Вы создаете вектор visited
и отмечаете позицию 1
как посещенную.Вы обнаружите, что в дереве есть ребро (0,1), и это вызывает if: adj_matrix[0][1] != 0 && visited[1]
, поэтому вы вводите рекурсивно с начальным узлом, равным 1
.На этот раз вы не строите вспомогательные данные, а отмечаете visited[1]
, вводите цикл, находите то же ребро и вызываете рекурсивно ...