実現したいこと
前回(https://teratail.com/questions/368301)と同様になりますが、編集が重なり質問内容が別物になっているため、改めての質問になります。
ランダムに作成された接続行列から値を空の配列a[en]に値を挿入していき、
配列a[en]の全要素が1になるまでに挿入した回数を出力したいです。
例)
頂点数(行) = 7 グラフの辺数(列) = 10 0 0 0 0 0 0 1 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 この行列から、a[en] = {1,1,1,1,1,1,1,1,1,1}となるまでに何回行の要素を組み合わせたか数えたい 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1
該当するソースコード
C++
1#include <iostream> 2#include <vector> 3#include <algorithm> 4#include <list> 5#include <random> 6 7using namespace std; 8 9bool graph[1010][1010]; 10 11class con_matrix 12{ 13private: 14 vector < vector<int>> matrix; 15public: 16 con_matrix(int vn, int en) { set_vertex_num(vn, en); } 17 void set_vertex_num(int vn, int en) 18 { 19 matrix.resize(vn); //行列行数を設定 20 for (auto& line : matrix) 21 line.resize(en); //行列列数を設定 22 } 23 int get_vertex_num() const { return matrix.size(); } 24 int get_edge_num() const { return matrix.at(0).size(); } 25 26 void set_random(unsigned int seed = 0) // seed:乱数シード(値を変えると乱数列が変化) 27 { 28 for (auto& row : matrix) 29 { 30 for (auto& v : row) 31 v = 0; //要素をクリア 32 } 33 34 int vn = matrix.size(); //頂点数 35 int en = matrix.at(0).size(); //辺数 36 srand(seed); 37 vector<pair<int, int>> es; 38 for (int i = 0; i < vn - 1; ++i) 39 for (int j = i + 1; j < vn; ++j) 40 es.emplace_back(i, j); 41 for (int i = 0; i < en; ++i) 42 { 43 swap(es[i], es[i + rand() % (es.size() - i)]); 44 matrix[es[i].first][i] = 1; 45 matrix[es[i].second][i] = 1; 46 } 47 } 48 void disp_connection() const 49 { 50 for (auto& row : matrix) { 51 for (auto v : row) 52 cout << v << " "; //要素を表示 53 cout << endl; //行列列数を設定 54 } 55 } 56}; 57 58 59//最小の被覆数を探索する関数(接続行列) 60void is_covering(con_matrix &con) 61{ 62 int vn = con.get_vertex_num(); // 頂点数 63 int en = con.get_edge_num(); // 辺数 64 int min_c[5] = {}; // 使用した頂点数 65 int w = 0; // カウント 66 int* a = new int[en]; 67 a[en] = {}; 68 vector < vector<int>> matrix; 69 con.set_random(1); 70 71 for (int min = 0; min < 5; min++) { 72 while( w < en){ 73 w = 0; 74 int i = rand() % vn; 75 for (int j = 0; j < en; j++) { 76 if (a[j] == 0 && matrix[i][j] == 1) { 77 a[j] = 1; 78 } 79 } 80 for (int o = 0; o < en; o++) { 81 w = +a[o]; 82 min_c[min] = +1; 83 } 84 } 85 } 86 for (int b = 0; b < 5; b++) { 87 cout << min_c[b] << ","; 88 } 89} 90 91 92int main() 93{ 94 const int n = 7; //頂点数 95 double r = 0.5; //辺数の比率 96 const int e = ((n * (n - 1) / 2) * r); 97 vector<int> con; 98 int cover = 0; // 被覆数 99 con_matrix am(n, e); 100 am.set_random(1); //ランダムにグラフの接続行列を作る。引数は乱数シード 101 102 103 104 cout << "頂点数 = " << n << endl; 105 cout << "グラフの辺数 = " << e << endl; 106 am.disp_connection(); 107 cout << endl; 108 is_covering(am); 109 return 0; 110}
試したこと・エラー内容
エラーは出ず、実行はできているのですが、min_cの出力がされないです。
また、以下の警告文が出てきます。
・'a'への書き込み中にバッファーオーバーランが発生しました:書き込み可能なサイズは'en*4'バイトですが、'en'バイトを書き込む可能性があります。
対象となる67行目を丸ごと消してみたりしても実行はできるのですが、「初期化されていません」と警告文が出てき、やはりmin_cが出力されないです。
環境
Visual Studio 2019 C++です
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。