質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1148閲覧

再帰関数でのDFSの実装

hakubo2

総合スコア11

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/05/21 13:59

編集2020/05/22 00:49

下記のような再帰関数での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
そのあと,1のノードに戻ってノード3に遷移しようとしますが,seen[3]=trueのままです.
遷移2
このように,上記のDFS再帰では0→1→2→3の遷移しか生成できないように思えるのですが,どのようなことが起こっているのでしょうか.
(0→1→3→2のような遷移は生成されないのでしょうか?)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ohys

2020/05/21 16:59

プログラムの全体像が見えないのですが、dfs関数を実行する前にseenはfalseで初期化するものだと思います。質問に載せていないところでそういった処理をしているのではないでしょうか?
hakubo2

2020/05/22 00:46

回答ありがとうございます. コード全体を載せて修正しました. 質問も不親切でしたので,図を追加しています. 教えてくださると幸いです.
guest

回答1

0

ベストアンサー

なにか根本的に勘違いしていると思うのですが、
一度通ったノードはもう探索する必要がないので、別の分岐で通る場合を考慮する必要が無いときに使うのが、深さ優先探索です。

投稿2020/05/22 02:26

yuki23

総合スコア1448

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hakubo2

2020/05/22 02:43

目的から勘違いしていたんですね. DFSでハミルトンパスを求めようとして,混乱したようです. ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問