回答編集履歴

5

G[pos][i] の値を全部追加

2022/09/08 14:03

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -29,12 +29,12 @@
29
29
  G の要素数は 100009 ですが、使っているのは G[1]~G[6] の 6個だけです。
30
30
  G は vector<int> を要素とする配列です。
31
31
  ```
32
- G[1] = {2, 3} G[1].size() = 2
32
+ G[1] = {2, 3} G[1].size() = 2 G[1][0] = 2, G[1][1] = 3
33
- G[2] = {1, 4, 5} G[2].size() = 3
33
+ G[2] = {1, 5, 4} G[2].size() = 3 G[2][0] = 1, G[2][1] = 5, G[2][2] = 4
34
- G[3] = {1, 4} G[3].size() = 2
34
+ G[3] = {1, 4} G[3].size() = 2 G[3][0] = 1, G[3][1] = 4
35
+ G[4] = {3, 2, 6} G[4].size() = 3 G[4][0] = 3, G[4][1] = 2, G[4][2] = 6
35
- G[4] = {2, 6} G[4].size() = 2
36
+ G[5] = {2, 6} G[5].size() = 2 G[5][0] = 2, G[5][1] = 6
36
- G[5] = {3, 2, 6} G[5].size() = 3
37
- G[6] = {4, 5} G[6].size() = 2
37
+ G[6] = {4, 5} G[6].size() = 2 G[6][0] = 4, G[6][1] = 5
38
38
  ```
39
39
  for文は G[pos].size() の合計の 14回まわっています。
40
40
 

4

実行結果の追加

2022/09/07 07:18

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -84,4 +84,18 @@
84
84
  6 7
85
85
  1 2 1 3 2 5 3 4 4 2 4 6 5 6
86
86
  ```
87
-
87
+ 実行結果
88
+ ```
89
+ G[1]: 2 3
90
+ G[2]: 1 5 4
91
+ G[3]: 1 4
92
+ G[5]: 2 6
93
+ G[4]: 3 2 6
94
+ G[6]: 4 5
95
+ 0
96
+ 1
97
+ 1
98
+ 2
99
+ 2
100
+ 3
101
+ ```

3

追記2

2022/09/07 04:59

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -14,3 +14,74 @@
14
14
  }
15
15
  cout << endl; // ★
16
16
  ```
17
+ **追記2**
18
+
19
+ > 2: ...*14と続いているのですが
20
+
21
+ 2:/3:/ ... 4:/5:/ (ただし / は改行) と続いています。
22
+
23
+ > [pos][i]と二つの配列があるのに
24
+
25
+ 2つの添字がありますが、配列は 1つの G だけです。
26
+
27
+ > .size()はG[]配列では[123456]と6要素しかないはずなのに14回for文が回っています。
28
+
29
+ G の要素数は 100009 ですが、使っているのは G[1]~G[6] の 6個だけです。
30
+ G は vector<int> を要素とする配列です。
31
+ ```
32
+ G[1] = {2, 3} G[1].size() = 2
33
+ G[2] = {1, 4, 5} G[2].size() = 3
34
+ G[3] = {1, 4} G[3].size() = 2
35
+ G[4] = {2, 6} G[4].size() = 2
36
+ G[5] = {3, 2, 6} G[5].size() = 3
37
+ G[6] = {4, 5} G[6].size() = 2
38
+ ```
39
+ for文は G[pos].size() の合計の 14回まわっています。
40
+
41
+ ところで、100009 という数字はどこから来ているのですか?
42
+ C++ では vector が使えるのですから、必要な個数だけ用意すればいいでしょう。
43
+ ```C++
44
+ #include <iostream>
45
+ #include <vector>
46
+ #include <queue>
47
+ using namespace std;
48
+
49
+ int main()
50
+ {
51
+ int N, M, A, B;
52
+ cin >> N >> M;
53
+ vector<int> dist(N+1, -1); // 初期値: -1(未到達)
54
+ vector<vector<int>> G(N+1);
55
+ for (int i = 0; i < M; i++) {
56
+ cin >> A >> B;
57
+ G[A].push_back(B);
58
+ G[B].push_back(A);
59
+ }
60
+ queue<int> Q; // 距離が求まった頂点
61
+ dist[1] = 0; // 頂点1 は距離 0
62
+ Q.push(1); // 頂点1 は距離確定
63
+
64
+ while (!Q.empty()) {
65
+ int pos = Q.front(); // Q の先頭を調べる(操作 2)
66
+ Q.pop();
67
+ cout << "G[" << pos << "]:";
68
+ for (int i = 0; i < (int)G[pos].size(); i++) {
69
+ int nex = G[pos][i];
70
+ cout << " " << nex;
71
+ if (dist[nex] == -1) {
72
+ dist[nex] = dist[pos] + 1;
73
+ Q.push(nex); // Q に nex を追加(操作 1)
74
+ }
75
+ }
76
+ cout << endl;
77
+ }
78
+ // 頂点 1 から各頂点までの最短距離を出力
79
+ for (int i = 1; i <= N; i++) cout << dist[i] << endl;
80
+ }
81
+ ```
82
+ 入力
83
+ ```
84
+ 6 7
85
+ 1 2 1 3 2 5 3 4 4 2 4 6 5 6
86
+ ```
87
+

2

コードの修正

2022/09/06 11:16

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -6,7 +6,7 @@
6
6
  cout << pos << ":"; // ★
7
7
  for (int i = 0; i < (int)G[pos].size(); i++) {
8
8
  int nex = G[pos][i];
9
- cout << " " << G[pos][i]; // ★
9
+ cout << " " << nex; // ★
10
10
  if (dist[nex] == -1) {
11
11
  dist[nex] = dist[pos] + 1;
12
12
  Q.push(nex); // Q に nex を追加(操作 1)

1

追記

2022/09/06 11:14

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -1 +1,16 @@
1
1
  6 7 の入力の後、辺の読み込みを 7組しかしていません。入力データは 14 行ありますよ。
2
+
3
+ **追記**
4
+ G[pos][i] の値を表示したければ、次のようにすればよいでしょう。
5
+ ```C++
6
+ cout << pos << ":"; // ★
7
+ for (int i = 0; i < (int)G[pos].size(); i++) {
8
+ int nex = G[pos][i];
9
+ cout << " " << G[pos][i]; // ★
10
+ if (dist[nex] == -1) {
11
+ dist[nex] = dist[pos] + 1;
12
+ Q.push(nex); // Q に nex を追加(操作 1)
13
+ }
14
+ }
15
+ cout << endl; // ★
16
+ ```