実現したいこと
前回(https://teratail.com/questions/367958)からの質問になります。
ランダムに作成された接続行列から値を空の配列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の出力がされないです。
環境
Visual Studio 2019 C++です
> 以下の部分に書き足すことで実装できると思って書き込んでいます。
とか言われても,その is_covering の引数や戻り値が何なのかも不明だし,
is_covering を呼び出す処理すらも無いみたいだから,一体どんな想定の上でこのメソッドを書いている途中なのか?等も他者には不明.
参考としたプログラムから、自分なりに書き込んだものであったため、未完全な状態で投稿してしまいました。すみません。
書き方が悪かったですかね.
不明 とは 説明する必要があるんじゃない? ということです.
例えば,
「is_covering の中身さえ完成すれば,それを使う側の処理の方は問題なくやれる」という想定であったとしたら,
「is_covering の引数は○○であり,このメソッドはこういう処理をして,戻り値として××を返す のだが,その実装ができない」とか述べれば何を解決すれば良いのかが明確になりますよね.
現状の質問文だと,「とにかくわからん」としか伝わらないので,読み手としても何が課題点なのかが判断できません.
(「やりたいことはあるんだけど,コードは1文字も書けません」とか言われても困るわけで)
「前回」とは? 調べりゃわかるだろ、と言わずにリンクを貼っておくのが気遣い/礼儀/常識というものです。
「エラー」とは? 「雑草という草はない」みたいな意味で、「エラー」とだけいうエラーはなく、なんらかの情報を持ったエラーメッセージが出たことをエラーと称しているはずです。つまり、エラーメッセージは「なにが問題であったか」が書かれた重要な情報です。当然あなたも精査したことと思いますが、なぜその重要な情報を質問で提示しないのでしょう?
> 出力された接続行列から、空の配列a[en]に1のみの列を挿入するようにしたい
こういうのをもっとちゃんと(より具体的に,誰が読んでも意味がわかるように)書くべき.
「配列に 列を 挿入する」とはどのような操作なのか?
配列の要素の型とは何か? (「列」を突っ込めるならば要素は「列」なのか?)
「1のみの列」とはどういう意味か? (これでは「全要素の値が1であるような列」と読めてしまうが…?)
質問のご指導、ありがとうございます。
とても勉強になります
> 初期化されていないメモリ'a'を使用しています
って言われたなら,適切に初期化してみたらどうなんでしょう.
その方法が分からないので、質問しています
参考となるものがあったら教えて欲しいです
> int* a = new int[en];
何か必要があって 要素数がen個の配列 を用意したんですよね.
では,これを使い始める時点においては,各要素の値とはいくつであるべきなんですか?
→この配列の値を見て何かをする処理を行うよりも前に,まずは適切な値を要素に突っ込んでおく必要がありますよね.
……っていうだけの話です.
参考とか何とかいうレベルの話ではなくて.
例えば,配列の最初の要素の値が7であって欲しいならば,7を代入しますよね.
a[0] = 7;
とか.
単にそんな話です.
全ての要素の値が5であってほしいならば
for( int i=0; i<en; ++i )a[i]=5;
とか何とかして,愚直に全要素に5を代入すればそれで目的を達することができるのではないですか?
回答1件
あなたの回答
tips
プレビュー