Я не вижу способа избежать обхода всего графа хотя бы один раз (при условии, что узлы не имеют ссылок на родителей). если это нормально, то простое решение, основанное на отображении узлов из набора непосредственных родителей («родительская карта» ниже):
написать подпрограмму, которая расширяет родительскую карту для всех узлов ниже начального узла (используя dfs). подпрограмме не нужно исследовать узлы, которые уже являются ключами на карте.
вызов подпрограммы выше для каждого узла в графе. это дает полную карту от узлов к родителям (по сути, транспонирование графа).
вызовите приведенную выше подпрограмму из данного узла в вопросе (например, 2) с новой картой. это дает карту от узлов к родителям, достижимым от 2.
используя bfs из данного узла, найдите первый узел, где родители на двух картах отличаются.
вам не нужно хранить фактические родительские узлы на карте (это проще всего объяснить таким образом); вы могли бы сделать нечто подобное, пометив посещенные узлы и сохранив количество родителей.
и еще один способ сказать это: найти транспозицию графа и множество узлов, достижимых из данного узла. затем BFS от данного узла, чтобы найти первый узел, где транспонирование приводит к родителю за пределами достижимого набора. (что на самом деле только вопрос ...)