「隣接行列から連結判定」の編集履歴(バックアップ)一覧はこちら

隣接行列から連結判定」(2005/11/07 (月) 06:06:05) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

<dl> <dt>162 :<a href="mailto:sage"><b>デフォルトの名無しさん</b></a> :2005/11/01(火) 17:20:58</dt> <dd>[1] 授業単元:プログラム演習&情報数学<br> [2] 問題文(含コード&amp;リンク):<br> 隣接行列を入力して、連結かどうかを判定するプログラムを作成せよ。<br> 連結かどうかの判定は、隣接行列をA、 位数(頂点の数)をmとしたとき、<br> A+A^2+…+A^(m-1) の成分に0があるものが連結ではないと言える。<br> <br> [3] 環境<br>  [3.1] OS: Linux<br>  [3.2] コンパイラ名とバージョン: gcc<br>  [3.3] 言語: C<br> [4] 期限: 2005年11月3日まで<br> [5] その他の制限: 特に無し<br> <br> 以上の内容なのですが、分かる方がいましたら教えてください。<br> よろしくお願いします。<br> <br></dd> <dt>163 :<a href="mailto:sage"><b>デフォルトの名無しさん</b></a> :2005/11/01(火) 17:24:50</dt> <dd><a href="http://pc8.2ch.net/test/read.cgi/tech/1130431335/162" target= "_blank">&gt;&gt;162</a><br> ちょっと用語がおかしいかも知れないが、ホップ数m-1以下で<br> 到達する経路の無い奴が有るかどうか調べろってこと?<br> <br> とりあえず行列のn乗返す関数作ってくる<br> <br></dd> <dt>164 :<a href="mailto:sage"><b>162</b></a>:2005/11/01(火) 17:32:38</dt> <dd><a href="http://pc8.2ch.net/test/read.cgi/tech/1130431335/163" target= "_blank">&gt;&gt;163</a><br> はい、そういう意味の問題です。<br> <br></dd> <dt>165 :<a href="mailto:sage"><b>デフォルトの名無しさん</b></a> :2005/11/01(火) 17:56:36</dt> <dd><a href="http://pc8.2ch.net/test/read.cgi/tech/1130431335/162" target= "_blank">&gt;&gt;162</a> 163 じゃないけどさくっと書いちゃったのでうp<br> #include &lt;stdio.h&gt;<br> #define m 5<br> int main() {<br>  int i, j, k, l;<br>  int A[m][m], B[m][m], C[m][m], tmpB[m][m];<br>  /* 初期化 (C: 0,B: 単位行列) */<br>  for (i = 0; i &lt; m; ++i) {<br>   for (j = 0; j &lt; m; ++j)<br>    A[i][j] = B[i][j] = C[i][j] = 0;<br>   B[i][i] = 1;<br>  }<br>  /* 連結してるところを 1 ,その他を 0 に設定 */<br>  A[0][1] = A[0][2] = A[2][3] = A[3][4] = A[3][1] = A[4][2] = 1;<br> <br></dd> <dt>166 :<a href="mailto:sage"><b>デフォルトの名無しさん</b></a> :2005/11/01(火) 17:59:36</dt> <dd> for (l = 1; l &lt;= m-1; ++l) { /* C = sum_k A^k */<br>   for (i = 0; i &lt; m; ++i)<br>    for (j = 0; j &lt; m; ++j)<br>     for (k = 0, tmpB[i][j] = 0; k &lt; m; ++k)<br>      tmpB[i][j] += B[i][k] * A[k][j]; /* B = A^k は前の値を使って計算 */<br>   for (i = 0; i &lt; m; ++i)<br>    for (j = 0; j &lt; m; ++j)<br>     B[i][j] = tmpB[i][j], C[i][j] += B[i][j];<br>  }<br>  for (i = 0; i &lt; m; ++i)<br>   for (j = 0; j &lt; m; ++j)<br>    if (C[i][j] == 0)<br>     printf("%d -&gt; %d cannot approve\n", i, j);<br> }<br> <br> オーダーは for 文を数えればわかるように O(V^4).<br> Floyd Warshall あたりを使えば O(V^3) でできるはずなので,不利なアルゴリズムと思う.<br> <br></dd> <dt>167 :<a href="mailto:sage"><b>165</b></a>:2005/11/01(火) 18:02:00</dt> <dd><a href="http://pc8.2ch.net/test/read.cgi/tech/1130431335/165" target= "_blank">&gt;&gt;165</a> コメントがミスリーディングだった.C = sum_k A^l.<br> <br></dd> <dt>168 :<a href="mailto:sage"><b>165</b></a>:2005/11/01(火) 18:03:11</dt> <dd><a href="http://pc8.2ch.net/test/read.cgi/tech/1130431335/167" target= "_blank">&gt;&gt;167</a> C = sum_l A^l 俺氏ね</dd> </dl>

表示オプション

横に並べて表示:
変化行の前後のみ表示:
目安箱バナー