質問編集履歴

5

エラー内容を訂正しました。

2021/11/10 00:14

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -264,9 +264,7 @@
264
264
 
265
265
  エラーは出ず、実行はできているのですが、min_cの出力がされないです。
266
266
 
267
- また、以下の警告文が出てきます。
267
+
268
-
269
- ・'a'への書き込み中にバッファーオーバーランが発生しました:書き込み可能なサイズは'en*4'バイトですが、'en'バイトを書き込む可能性があります。
270
268
 
271
269
 
272
270
 

4

プログラムの訂正、エラー内容を訂正しました。

2021/11/10 00:14

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -46,8 +46,6 @@
46
46
 
47
47
  #include <random>
48
48
 
49
- #include <numeric>
50
-
51
49
 
52
50
 
53
51
  using namespace std;
@@ -152,6 +150,8 @@
152
150
 
153
151
 
154
152
 
153
+
154
+
155
155
  //最小の被覆数を探索する関数(接続行列)
156
156
 
157
157
  void is_covering(con_matrix &con)
@@ -162,19 +162,21 @@
162
162
 
163
163
  int en = con.get_edge_num(); // 辺数
164
164
 
165
- int min_c[10] = {}; // 実験回
165
+ int min_c[5] = {}; // 使用した頂点
166
-
166
+
167
- int w = 0; // 値を挿入したカウント
167
+ int w = 0; // カウント
168
168
 
169
169
  int* a = new int[en];
170
170
 
171
+ a[en] = {};
172
+
171
173
  vector < vector<int>> matrix;
172
174
 
173
175
  con.set_random(1);
174
176
 
175
177
 
176
178
 
177
- for (int min = 0; min < 10; min++) {
179
+ for (int min = 0; min < 5; min++) {
178
180
 
179
181
  while( w < en){
180
182
 
@@ -186,25 +188,25 @@
186
188
 
187
189
  if (a[j] == 0 && matrix[i][j] == 1) {
188
190
 
189
- a[i] = matrix[i][j];
191
+ a[j] = 1;
190
192
 
191
193
  }
192
194
 
193
195
  }
194
196
 
195
-              for (int o = 0; o < en; o++) {
197
+ for (int o = 0; o < en; o++) {
196
-
198
+
197
- w = +a[o];
199
+ w = +a[o];
200
+
198
-
201
+ min_c[min] = +1;
202
+
199
-              }
203
+ }
200
-
201
- min_c[min] = +1;
204
+
202
-
203
- }
205
+ }
204
-
206
+
205
- }
207
+ }
206
-
208
+
207
- for (int b = 0; b < 10; b++) {
209
+ for (int b = 0; b < 5; b++) {
208
210
 
209
211
  cout << min_c[b] << ",";
210
212
 
@@ -214,6 +216,8 @@
214
216
 
215
217
 
216
218
 
219
+
220
+
217
221
  int main()
218
222
 
219
223
  {
@@ -224,6 +228,8 @@
224
228
 
225
229
  const int e = ((n * (n - 1) / 2) * r);
226
230
 
231
+ vector<int> con;
232
+
227
233
  int cover = 0; // 被覆数
228
234
 
229
235
  con_matrix am(n, e);
@@ -232,6 +238,10 @@
232
238
 
233
239
 
234
240
 
241
+
242
+
243
+
244
+
235
245
  cout << "頂点数 = " << n << endl;
236
246
 
237
247
  cout << "グラフの辺数 = " << e << endl;
@@ -240,12 +250,8 @@
240
250
 
241
251
  cout << endl;
242
252
 
243
-
244
-
245
253
  is_covering(am);
246
254
 
247
-
248
-
249
255
  return 0;
250
256
 
251
257
  }
@@ -256,13 +262,11 @@
256
262
 
257
263
  ### 試したこと、エラー内容
258
264
 
259
- 関数is_coveringにクスcon_matrixの関数を書き込みmatrix[i][j] = 1あれば配列a[en]の要素を1にし、全要素がうままで繰り返すようにし、こ行為を10回繰り返すようにしたのですが、出力されないです。(実行はできています。)
265
+ ーは出ず実行はきているのですが、min_cの出力されないです。
260
-
261
-
262
-
266
+
263
- また以下の警告文が出てきます。
267
+ また以下の警告文が出てきます。
264
-
268
+
265
- 初期化されていないメモリ'a'を使用ています
269
+ ・'a'への書き込み中にバッファーオーバーランが発生しました:書き込み可能なサイズは'en*4'バイトでが、'en'バイトを書き込む可能性があります。
266
270
 
267
271
 
268
272
 

3

プログラムの訂正、エラー内容、実施環境を追加しました。

2021/11/09 13:00

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- 生成されたグラフを呼び出す方法
1
+ グラフを呼び出し、値を挿入方法
test CHANGED
@@ -1,8 +1,34 @@
1
- ### 前提・実現したいこと
1
+ ### 実現したいこと
2
-
2
+
3
- 前回からの質問になります。
3
+ 前回(https://teratail.com/questions/367958)からの質問になります。
4
-
4
+
5
- フをランダムに作成し、出力された接続行列から空の配列a[en]に1のみの列を挿入するようにのですがエラーで動かないです
5
+ ランダムに作成された接続行列から値を空の配列a[en]にを挿入し
6
+
7
+ 配列a[en]の全要素が1になるまでに挿入した回数を出力したいです
8
+
9
+ 例)
10
+
11
+ ```
12
+
13
+ 頂点数(行) = 7
14
+
15
+ グラフの辺数(列) = 10
16
+
17
+ 0 0 0 0 0 0 1 1 1 1
18
+
19
+ 0 1 1 1 0 0 0 0 0 0
20
+
21
+ 0 0 0 0 1 0 0 0 1 0
22
+
23
+ 0 0 0 1 0 1 1 0 0 0 この行列から、a[en] = {1,1,1,1,1,1,1,1,1,1}となるまでに何回行の要素を組み合わせたか数えたい
24
+
25
+ 0 1 0 0 0 0 0 1 0 0
26
+
27
+ 1 0 1 0 0 0 0 0 0 0
28
+
29
+ 1 0 0 0 1 1 0 0 0 1
30
+
31
+ ```
6
32
 
7
33
 
8
34
 
@@ -20,6 +46,8 @@
20
46
 
21
47
  #include <random>
22
48
 
49
+ #include <numeric>
50
+
23
51
 
24
52
 
25
53
  using namespace std;
@@ -126,29 +154,61 @@
126
154
 
127
155
  //最小の被覆数を探索する関数(接続行列)
128
156
 
129
- int is_covering(const con_matrix& con)
157
+ void is_covering(con_matrix &con)
130
158
 
131
159
  {
132
160
 
133
- int vn = con.get_vertex_num();
161
+ int vn = con.get_vertex_num(); // 頂点数
134
-
162
+
135
- int en = con.get_edge_num();
163
+ int en = con.get_edge_num(); // 辺数
136
-
137
- con_matrix am(vn, en);
164
+
138
-
139
- am.set_vertex_num(vn,en);
140
-
141
- am.set_random(1);
142
-
143
-
144
-
145
- int min_c = 0;
165
+ int min_c[10] = {}; // 実験回数
166
+
167
+ int w = 0; // 値を挿入したカウント
146
168
 
147
169
  int* a = new int[en];
148
170
 
149
-
171
+ vector < vector<int>> matrix;
150
-
172
+
151
- return min_c;
173
+ con.set_random(1);
174
+
175
+
176
+
177
+ for (int min = 0; min < 10; min++) {
178
+
179
+ while( w < en){
180
+
181
+ w = 0;
182
+
183
+ int i = rand() % vn;
184
+
185
+ for (int j = 0; j < en; j++) {
186
+
187
+ if (a[j] == 0 && matrix[i][j] == 1) {
188
+
189
+ a[i] = matrix[i][j];
190
+
191
+ }
192
+
193
+ }
194
+
195
+              for (int o = 0; o < en; o++) {
196
+
197
+ w = +a[o];
198
+
199
+              }
200
+
201
+ min_c[min] = +1;
202
+
203
+ }
204
+
205
+ }
206
+
207
+ for (int b = 0; b < 10; b++) {
208
+
209
+ cout << min_c[b] << ",";
210
+
211
+ }
152
212
 
153
213
  }
154
214
 
@@ -180,6 +240,8 @@
180
240
 
181
241
  cout << endl;
182
242
 
243
+
244
+
183
245
  is_covering(am);
184
246
 
185
247
 
@@ -192,6 +254,18 @@
192
254
 
193
255
 
194
256
 
195
- ### 試したこと
257
+ ### 試したこと、エラー内容
196
-
258
+
197
- クラス内の関数set_randomなどにあるmatrix[][]を利用とで空配列挿入できると思ったのですが、エラーで動かないです。
259
+ 関数is_coveringにクラスcon_matrixの関数を書き込み、matrix[i][j] = 1であれば配列a[en]の要素1にし、全要素がうまるまで繰り返ようにし、この行為を10回繰り返すようたのですが、出力されないです。(実行はできています。)
260
+
261
+
262
+
263
+ また以下の警告文が出てきます。
264
+
265
+ ・初期化されていないメモリ'a'を使用しています
266
+
267
+
268
+
269
+ ### 環境
270
+
271
+ Visual Studio 2019 C++です

2

試したことや実現したいことを変更しました。何かしらのヒントのみでもあれば幸いです。

2021/11/09 02:16

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- 接続行列使って、頂点被覆をC++で求めたい
1
+ 生成されたグラフ呼び出す方法
test CHANGED
@@ -2,53 +2,11 @@
2
2
 
3
3
  前回からの質問になります。
4
4
 
5
- グラフをランダムに作成し、出力された接続行列を読み込み中が全てになるように
5
+ グラフをランダムに作成し、出力された接続行列から配列a[en]にのみの列を挿入するようにしたいのですが、エラーで動かないです
6
-
7
- 組み合わせたいのですが、どうしたらいいかわからないです。
8
6
 
9
7
 
10
8
 
11
-
12
-
13
-
14
-
15
- ### 全体のプログラミング
16
-
17
- 自身が実装したいプログラムのリストと、
18
-
19
- 自分が作成しているプログラムの今現在の段階です。
20
-
21
-
22
-
23
- ```
24
-
25
- 頂点と辺の数を入力する
26
-
27
-
28
-
29
- 接続行列を生成(行:頂点数、列;辺数)
30
-
31
-
32
-
33
- 空の配列(辺数)を宣言し、接続行列を行を配列に挿入していき、
34
-
35
- 配列の中が全て「1」となるものを見つける               ←今現在取り組んでいるもの
36
-
37
-
38
-
39
- 使用した行(頂点)の数を数え、最小のものが出るまで繰り返す
40
-
41
-
42
-
43
- 全ての探索をし終えた後、最小の行(頂点)の数を出力する
44
-
45
- ```
46
-
47
-
48
-
49
- ### 該当ソースコード
9
+ ### 該当するソースコード
50
-
51
-
52
10
 
53
11
  ```C++
54
12
 
@@ -150,7 +108,7 @@
150
108
 
151
109
  {
152
110
 
153
- for (auto& row : matrix){
111
+ for (auto& row : matrix) {
154
112
 
155
113
  for (auto v : row)
156
114
 
@@ -162,63 +120,35 @@
162
120
 
163
121
  }
164
122
 
165
-
166
-
167
- int connection(int i, int j) const { return matrix[i][j]; }
168
-
169
- void make_con_list(vector<vector<int>>& al) const
170
-
171
- {
172
-
173
- int vn = matrix.size(); //頂点数
174
-
175
- al.resize(vn);
176
-
177
- for (int i = 0; i < vn; i++)
178
-
179
- {
180
-
181
- al[i].resize(0);
182
-
183
- for (int j = 0; j < vn; j++)
184
-
185
- {
186
-
187
- if (connection(i, j))
188
-
189
- al[i].push_back(j);
190
-
191
- }
192
-
193
- }
194
-
195
- }
196
-
197
-
198
-
199
123
  };
200
124
 
201
125
 
202
126
 
203
- void disp_adj_list(const vector<vector<int>>& al)
127
+ //最小の被覆数を探索する関数(接続行列)
204
128
 
205
- {
129
+ int is_covering(const con_matrix& con)
206
130
 
207
- for (auto& list : al)
131
+ {
208
132
 
209
- {
133
+ int vn = con.get_vertex_num();
210
134
 
211
- for (auto v : list)
135
+ int en = con.get_edge_num();
212
136
 
213
- {
137
+ con_matrix am(vn, en);
214
138
 
215
- cout << v << " "; //行列列数を設定
139
+ am.set_vertex_num(vn,en);
216
140
 
217
- }
141
+ am.set_random(1);
218
142
 
219
- cout << endl; //行列列数を設定
220
143
 
144
+
145
+ int min_c = 0;
146
+
147
+ int* a = new int[en];
148
+
149
+
150
+
221
- }
151
+ return min_c;
222
152
 
223
153
  }
224
154
 
@@ -250,6 +180,8 @@
250
180
 
251
181
  cout << endl;
252
182
 
183
+ is_covering(am);
184
+
253
185
 
254
186
 
255
187
  return 0;
@@ -257,3 +189,9 @@
257
189
  }
258
190
 
259
191
  ```
192
+
193
+
194
+
195
+ ### 試したこと
196
+
197
+ クラス内の関数、set_randomなどにあるmatrix[][]を利用することで空の配列に挿入できると思ったのですが、エラーで動かないです。

1

指摘していただいた部分を丸ごと消去いたしました。自分もこの状態からどのように書き込めばよいのかも分からないため、何かアドバイスをもらえると幸いだと思い質問させていただいてます。

2021/11/08 15:53

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -224,104 +224,36 @@
224
224
 
225
225
 
226
226
 
227
- //頂点被覆かチェックする関数(接続行列)
227
+ int main()
228
-
229
- int is_covering(const con_matrix& con, const int cover[])
230
228
 
231
229
  {
232
230
 
233
- int vn = con.get_vertex_num();
234
-
235
- int en = con.get_edge_num();
236
-
237
- int max_c = 0;
238
-
239
-
240
-
241
- for (int i = 0; i < vn; i++){
231
+ const int n = 7; //頂点数
232
+
242
-
233
+ double r = 0.5; //辺数の比率
234
+
243
- for (int j = 0; j < en; j++){
235
+ const int e = ((n * (n - 1) / 2) * r);
236
+
244
-
237
+ int cover = 0; // 被覆数
238
+
239
+ con_matrix am(n, e);
240
+
241
+ am.set_random(1); //ランダムにグラフの接続行列を作る。引数は乱数シード
242
+
243
+
244
+
245
+ cout << "頂点数 = " << n << endl;
246
+
247
+ cout << "グラフの辺数 = " << e << endl;
248
+
249
+ am.disp_connection();
250
+
245
- int c = cover[j];
251
+ cout << endl;
246
-
247
- if (c == 1);
252
+
248
-
249
- }
253
+
250
-
251
- }
254
+
252
-
253
- return max_c;
255
+ return 0;
254
256
 
255
257
  }
256
258
 
257
-
258
-
259
- int main()
260
-
261
- {
262
-
263
- const int n = 7; //頂点数
264
-
265
- double r = 0.5; //辺数の比率
266
-
267
- const int e = ((n * (n - 1) / 2) * r);
268
-
269
- int cover = 0; // 被覆数
270
-
271
- con_matrix am(n, e);
272
-
273
- am.set_random(1); //ランダムにグラフの接続行列を作る。引数は乱数シード
274
-
275
-
276
-
277
- cout << "頂点数 = " << n << endl;
278
-
279
- cout << "グラフの辺数 = " << e << endl;
280
-
281
- am.disp_connection();
282
-
283
- cout << endl;
284
-
285
-
286
-
287
- return 0;
288
-
289
- }
290
-
291
259
  ```
292
-
293
- 以下の部分に書き足すことで実装できると思って書き込んでいます。
294
-
295
- ```
296
-
297
- //頂点被覆かチェックする関数(接続行列)
298
-
299
- int is_covering(const con_matrix& con, const int cover[])
300
-
301
- {
302
-
303
- int vn = con.get_vertex_num();
304
-
305
- int en = con.get_edge_num();
306
-
307
- int max_c = 0;
308
-
309
-
310
-
311
- for (int i = 0; i < vn; i++){
312
-
313
- for (int j = 0; j < en; j++){
314
-
315
- int c = cover[j];
316
-
317
- if (c == 1);
318
-
319
- }
320
-
321
- }
322
-
323
- return max_c;
324
-
325
- }
326
-
327
- ```