下記のような再帰関数でのDFSの実装について質問です.
c++
1#include <iostream> 2#include <vector> 3using namespace std; 4using Graph = vector<vector<int>>; 5 6vector<bool> seen; 7void dfs(const Graph &G, int v) { 8 seen[v] = true; 9 10 for (auto next_v : G[v]) { 11 if (seen[next_v]) continue; 12 dfs(G, next_v); 13 } 14} 15 16int main() { 17 int N, M; cin >> N >> M; 18 19 Graph G(N); 20 for (int i = 0; i < M; ++i) { 21 int a, b; 22 cin >> a >> b; 23 G[a].push_back(b); 24 G[b].push_back(a); 25 } 26 27 seen.assign(N, false); 28 dfs(G, 0); 29}
seen[v]で訪問したノードを管理していると思いますが,seen[v]=falseとする処理がありません.
感覚的には,これでは一度訪問したノードはtrueとなり続け,いちばん深くまでたどったあとに遡って別の分岐をおこなおうとした際にcontinueになってしまうノードが出てきてしまうように思います.
なぜ上記のような再帰関数の実装が可能なのでしょうか.
(seenは深さごとにローカル変数のように読み込まれているのでしょうか...?)
質問がわかりずらいので補足させていただきます.
まず,下図のようなグラフに赤線で一番深くまで遷移したとします.
この時点ですべてのノードはseen=trueですよね.
そのあと,1のノードに戻ってノード3に遷移しようとしますが,seen[3]=trueのままです.
このように,上記のDFS再帰では0→1→2→3の遷移しか生成できないように思えるのですが,どのようなことが起こっているのでしょうか.
(0→1→3→2のような遷移は生成されないのでしょうか?)
回答1件
あなたの回答
tips
プレビュー