Paiza問題集の隣接行列の出力・無向グラフ PHP編をやってみた。コードを公開していいそうなので公開している。この問題は無向グラフの順接行列を出力する問題。
入力が、
3 2
1 2
2 3
出力が、
0 1 0
1 0 1
0 1 0
となるコードを書けとのこと。
出力結果を隣接行列と呼んでいるらしい。
入力1行目のn=3がNodeでm=2が辺(組)を現し、それ以降の行は辺になっているNode番号が並ぶ。
出力はパッと見で何を現しているのかわかりにくいが、Node1がNode2と辺になっている(隣接している)ことを値1で現している(逆に辺になっていない(隣接していない)ことを値0で現している)。
…よって1行目は「0 1 0」、次の行はNode2はNode1とNodes3と隣接しているので「1 0 1」となるとのこと。
—-
合格をもらうために書いたPHPのコードは以下の通り。
<?php $a = explode(' ', trim(fgets(STDIN))); // 結果用配列$rの作成/初期化 $r = []; for($i = 0; $i < $a[0]; $i++){ for($j = 0; $j < $a[0]; $j++){ $r[$i][$j] = 0; } } // 辺の情報を元に隣接行列を格納 for($i = 0; $i < $a[1]; $i++){ $h = explode(' ', trim(fgets(STDIN))); $r[($h[0]-1)][($h[1]-1)] = 1; $r[($h[1]-1)][($h[0]-1)] = 1; } // 結果を出力 for($i = 0; $i < $a[0]; $i++){ for($j = 0; $j < $a[0]; $j++){ echo ($j+1!=$a[0]) ? $r[$i][$j]. " " : $r[$i][$j]; } echo "\n"; } ?>
…というわけでこのようなコードを書いた。以下は捕捉解説と個人的なぼやきです。
「結果用配列$rの作成/初期化」ではそのまま、n*nの2次元配列を定義してすべてとりあえず0(隣接なし)として初期化する。
「辺の情報を元に隣接行列を格納」では、辺の入力がされるのでそのまま結果用配列$rへ格納する。
配列IndexはNode番号から-1した値になるため-1して、順方向と逆方向それぞれのフラグを立てるので、
> $r[($h[0]-1)][($h[1]-1)] = 1;
> $r[($h[1]-1)][($h[0]-1)] = 1;
と、記述した。
「結果を出力」では三項演算子を使用して、行末以外は半角スペースを連結せず出力した。
※組と辺は意味が違うが問題を解くにあたっては同じものなのに字面が違う表現されていて脳のワーキングスペースが無駄に消費されて辛い。
コメント