今回は paiza の「隣接頂点の出力」の問題に挑戦!
🧩 問題概要
■ 何が与えられる?
- 頂点が
1〜nまで番号づけされた無向グラフ - 自己ループなし
- 多重辺なし
- 隣接リスト形式で入力される
- 特定の頂点
s
■ 入力の構造
- 1行目
-
n(頂点数) -
s(対象の頂点)
-
- その後、各頂点
i(1〜n) について:- 頂点
iに隣接している頂点の数v_i - 頂点
iに隣接している頂点番号
- 頂点
■ やること
- 頂点
sに 隣接している頂点の中で - 最も番号が大きい頂点を出力する
入力例:
3 2
1
2
2
1 3
1
2
出力例:
3
✅OK例:
const rl = require('readline').createInterface({ input: process.stdin });
const lines = [];
rl.on('line', line => lines.push(line));
rl.on('close', () => {
const [n, s] = lines[0].split(' ').map(Number);
const graph = [];
for (let i = 2; i <= n*2; i++) {
if (i % 2 === 0) {
graph.push(lines[i].split(' ').map(Number));
}
}
const ans = Math.max(...graph[s-1]);
console.log(ans);
});
🔍コードの流れ
-
readlineで標準入力を受け取る準備をする - 入力された各行を配列
linesに保存する - 1行目から
- 頂点数
n - 調べたい頂点
s
を取得する
- 頂点数
- 空の配列
graphを用意する - 2行目以降をループで確認する
- 偶数行(隣接頂点が書かれている行)だけを取り出す
- その行を数値配列に変換して
graphに追加する - これで
-
graph[0]= 頂点1の隣接リスト -
graph[1]= 頂点2の隣接リスト
という形になる
-
-
sは1から始まる番号なので- 配列用に
s-1に変換する
- 配列用に
-
graph[s-1]の中からMath.maxを使って最大の頂点番号を取得する - その最大値を出力する
📝まとめ
「隣接リストを配列に格納 → s番目の配列の最大値を出す」だけの処理
隣接リストの読み取り
- グラフは「隣接リスト」で表現できる
-
graph[i]= 頂点i+1の隣接頂点配列