深さ優先検索疑問点について

前提

入力として Nは頂点数6M辺数7とする
A[100009]配列
B[100009]配列
この二つは隣接しているリストとする
「vector<int> G[100009];」のGは頂点の番号を表している。
このようにA[i]B[i]に以下のように入力例とする
G1:{2,3}
G2:{1,4,5}
G3{1,4}
G4{2,3,6}
G5{2,6}
G6{5,4}
2列3行の四角形になります。

bool visited[100009]; visited[pos]=false のとき頂点 x が白色、true のとき灰色
とします。

手順としては

『手順1.全ての頂点を白色で塗る
手順2.一番最初に頂点1を訪問し、頂点1を灰色で塗る
手順3.その後、以下の操作を繰り返す。頂点1で以下のaが当てはまったら検索終了。
a. 隣接する頂点がすべて灰色である場合、一歩だけ戻る。
b. そうでは無い場合、隣接する白色頂点のうち番号が最小の頂点を訪問する。新たに頂点を訪問する際には、その頂点を灰色で塗る。
手順4.最終的にすべての頂点が灰色で塗られた場合、グラフは連結する。』
引用:問題解決のための「アルゴリズム×数学」が基礎からしっかり身につく本 単行本(ソフトカバー) – 2021/12/25
米田 優峻 (著)

出力としてはこのグラフが連結であるかどうかを求めるプログラムです

発生している問題

void dfs(int pos) { visited[pos] = true; // for (int i : G[pos]) のような書き方を「範囲 for 文」といいます。(APG4b 2.01 節) for (int i : G[pos]) { if (visited[i] == false) dfs(i); } }

この部分で
最初にint pos で定義したのにvisited[pos] = true;とposがbool型になるのは問題ないのですか

void dfs(int pos) { visited[pos] = true;// 手順2.一番最初に頂点1を訪問し、頂点1を灰色で塗る // for (int i : G[pos]) のような書き方を「範囲 for 文」といいます。(APG4b 2.01 節) for (int i : G[pos]) { if (visited[i] == false) dfs(i); } }

上記の部分は手順で言うと下記と対応していると思います。
『手順2.一番最初に頂点1を訪問し、頂点1を灰色で塗るvisited[pos] = true;このプログラムと対応している。
手順3.その後、以下の操作を繰り返す。頂点1で以下のaが当てはまったら検索終了。
a. 隣接する頂点がすべて灰色である場合、一歩だけ戻る。
b. そうでは無い場合、隣接する白色頂点のうち番号が最小の頂点を訪問する。新たに頂点を訪問する際には、その頂点を灰色で塗る。』

for (int i : G[pos]) { if (visited[i] == false) dfs(i); } }

この上記のプログラムでは
手順3.その後、以下の操作を繰り返す。頂点1で以下のaが当てはまったら検索終了。
a. 隣接する頂点がすべて灰色である場合、一歩だけ戻る。
b. そうでは無い場合、隣接する白色頂点のうち番号が最小の頂点を訪問する。新たに頂点を訪問する際には、その頂点を灰色で塗る。
と対応していると思いますが
隣接する頂点がすべて灰色である場合、一歩だけ戻るとプログラムで記述されているようには思えません。
また、最小の頂点を訪問しているとプログラムで記述されているようには思えません。どのように動いているのかご教授お願いできませんか

該当のソースコード

#include <iostream> #include <vector> #include <algorithm> using namespace std; int N, M, A[100009], B[100009]; vector<int> G[100009]; bool visited[100009]; // visited[pos]=false のとき頂点 x が白色、true のとき灰色 void dfs(int pos) { visited[pos] = true; // for (int i : G[pos]) のような書き方を「範囲 for 文」といいます。(APG4b 2.01 節) for (int i : G[pos]) { if (visited[i] == false) dfs(i); } } int main() { // 入力 cin >> N >> M; for (int i = 1; i <= M; i++) { cin >> A[i] >> B[i]; G[A[i]].push_back(B[i]); G[B[i]].push_back(A[i]); } // 深さ優先探索 dfs(1); // 連結かどうかの判定(Answer=true のとき連結) bool Answer = true; for (int i = 1; i <= N; i++) { if (visited[i] == false) Answer = false; } if (Answer == true) cout << "The graph is connected." << endl; else cout << "The graph is not connected." << endl; return 0; }

補足情報(FW/ツールのバージョンなど)

問題解決のための「アルゴリズム×数学」が基礎からしっかり身につく本 単行本(ソフトカバー) – 2021/12/25
米田 優峻 (著)
4.5.6深さ優先検索P170〜172

コメントを投稿

0 コメント