回答編集履歴

1

サンプルコードを追加

2022/09/05 11:35

投稿

退会済みユーザー
test CHANGED
@@ -1,3 +1,113 @@
1
+ 動作のイメージ確認用にcoutによる状態出力を追加してみました。
2
+
3
+ ```c++
4
+ #include <iostream>
5
+ #include <vector>
6
+ #include <algorithm>
7
+ using namespace std;
8
+
9
+ int N, M, A[100009], B[100009];
10
+ vector<int> G[100009];
11
+ bool visited[100009]; // visited[pos]=false のとき頂点 x が白色、true のとき灰色
12
+
13
+ void dfs(int pos) {
14
+ cout << "starting dfs(" << pos << ")" << endl;
15
+ visited[pos] = true;
16
+ // for (int i : G[pos]) のような書き方を「範囲 for 文」といいます。(APG4b 2.01 節)
17
+ for (int i : G[pos]) {
18
+ cout << "in dfs(" << pos << ") for loop" << endl;
19
+ cout << " i = " << i << endl;
20
+ if (visited[i] == false) dfs(i);
21
+ }
22
+ cout << "exiting dfs(" << pos << ")" << endl;
23
+ }
24
+
25
+ int main() {
26
+ // 入力
27
+ cin >> N >> M;
28
+ for (int i = 1; i <= M; i++) {
29
+ cin >> A[i] >> B[i];
30
+ G[A[i]].push_back(B[i]);
31
+ G[B[i]].push_back(A[i]);
32
+ }
33
+
34
+ // 深さ優先探索
35
+ dfs(1);
36
+
37
+ // 連結かどうかの判定(Answer=true のとき連結)
38
+ bool Answer = true;
39
+ for (int i = 1; i <= N; i++) {
40
+ if (visited[i] == false) Answer = false;
41
+ }
42
+ if (Answer == true) cout << "The graph is connected." << endl;
43
+ else cout << "The graph is not connected." << endl;
44
+ return 0;
45
+ }
46
+ ```
47
+
48
+ この状態でプログラムを実行すると以下のようなログになります。
49
+ ログを読んでいくと以下のようなことが分かります
50
+ - dfs(6)が呼び出されるのは、dfs(5)のforループの中から
51
+ - dfs(6)内で6に隣接するノード5, 4をチェックするが、訪問済(visited[i] == true)なので、ここからdfs(5), dfs(4)を呼び出すことはない
52
+ - dfs(6)終了後、dfs(5)のforループに戻って実行を続けている
53
+
54
+
55
+ ```text
56
+ // グラフ情報の入力
57
+ 6 7
58
+ 1 3
59
+ 1 2
60
+ 5 6
61
+ 2 4
62
+ 2 5
63
+ 3 4
64
+ 4 6
65
+
66
+ // プログラムからの出力
67
+ starting dfs(1)
68
+ in dfs(1) for loop
69
+ i = 3
70
+ starting dfs(3)
71
+ in dfs(3) for loop
72
+ i = 1
73
+ in dfs(3) for loop
74
+ i = 4
75
+ starting dfs(4)
76
+ in dfs(4) for loop
77
+ i = 2
78
+ starting dfs(2)
79
+ in dfs(2) for loop
80
+ i = 1
81
+ in dfs(2) for loop
82
+ i = 4
83
+ in dfs(2) for loop
84
+ i = 5
85
+ starting dfs(5)
86
+ in dfs(5) for loop
87
+ i = 6
88
+ starting dfs(6)
89
+ in dfs(6) for loop
90
+ i = 5
91
+ in dfs(6) for loop
92
+ i = 4
93
+ exiting dfs(6)
94
+ in dfs(5) for loop
95
+ i = 2
96
+ exiting dfs(5)
97
+ exiting dfs(2)
98
+ in dfs(4) for loop
99
+ i = 3
100
+ in dfs(4) for loop
101
+ i = 6
102
+ exiting dfs(4)
103
+ exiting dfs(3)
104
+ in dfs(1) for loop
105
+ i = 2
106
+ exiting dfs(1)
107
+ The graph is connected.
108
+ ```
109
+
110
+ ---
1
111
  ご質問にある本は持っていないのですが、a, bの説明を以下のように少し変更して読んでみてはいかがでしょうか。
2
112
 
3
113
  **a.** 隣接する頂点がすべて灰色である場合、(dfs関数を抜けることで)一歩だけ戻る。