1. 三角形 + 別成分、start=0 -> 3
  2. 三角形 + 別成分、start=3 -> 2
  3. 孤立ノード -> 1
  4. 鎖 0-1-2-3、start=0 -> 4
  5. 全連結 5 ノード
  6. 中間ノードから BFS
コース一覧
コンピューターサイエンス上級:アルゴリズムとデータ構造
グラフ BFS で連結成分サイズを求める

コンピューターサイエンス上級:アルゴリズムとデータ構造

探索、ソート、木、グラフ、動的計画法、貪欲法など、競技プログラミングや技術面接で問われる高度なアルゴリズムとデータ構造を学べるコースです。基本的な CS の知識を持ち、アルゴリズム力を伸ばしたい学習者や、外資・大手の技術面接対策をしたい方を対象としています。約 13 時間 (1 日 30 分 × 26 日) で 50 レッスンを修了でき、修了後はコーディング面接の実装問題を構造的に解けるようになります。

1
連結リスト
01. リンクリスト構築と長さの計算5分
02. リンクリストの反転5分
03. リンクリストのサイクル検出5分
04. ソート済みリンクリストの merge5分
05. リンクリストの中央ノード取得5分
06. ソート済みリストの重複削除5分
07. 第1章まとめクイズ5分
2
二分木
01. 二分木の in-order 走査5分
02. 二分木の pre-order 走査5分
03. 二分木の post-order 走査5分
04. 二分木の幅優先走査 (BFS)5分
05. 二分木の高さ5分
06. 二分木の平衡判定5分
07. 第2章まとめクイズ — 二分木5分
3
探索木 (BST)
01. BST に値を挿入する5分
02. BST から値を検索する5分
03. BST の最小値と最大値5分
04. BST 妥当性チェック5分
05. BST で k 番目に小さい値5分
06. BST から値を削除する5分
07. 第 3 章 まとめクイズ5分
4
ハッシュとセット
01. hashmap で頻度集計5分
02. キーでグループ化5分
03. two sum (hash で O(n))5分
04. 部分配列の和 = k の個数5分
05. 最長連続部分列5分
06. 集合の積 (intersection)5分
07. 第4章まとめクイズ5分
5
グラフ
01. グラフ BFS で連結成分サイズを求める5分
02. グラフ DFS で連結成分の数を数える5分
03. グラフのパス存在判定5分
04. BFS で最短経路の長さを求める5分
05. トポロジカルソート5分
06. 2 部グラフ判定5分
07. ダイクストラ法 — 重み付きグラフの最短経路15分
08. 第5章まとめクイズ — グラフ5分
6
動的計画法 (上級)
01. 編集距離 (レーベンシュタイン距離)5分
02. 最長増加部分列(LIS)の解法 ── AOJ 2430 対応の動的計画法5分
03. 最大部分配列和 (Kadane)5分
04. 隣り合わない最大値 (House Robber)5分
05. グリッド経路数 (Unique Paths)5分
06. 単語分割可能か (Word Break)5分
07. 第6章まとめクイズ — 動的計画法 (上級)5分
7
総合データ構造と関数型
01. map と filter を組み合わせる5分
02. reduce で積を計算5分
03. 関数合成5分
04. カリー化5分
05. trie の単純検索 (prefix マッチ)5分
06. Union-Find (連結成分数)5分
07. 最終総まとめクイズ5分

グラフ BFS で連結成分サイズを求める

同じ人を 2 回数えてしまう

社内チャットの「誰と誰がつながっているか」の一覧をもらったとします。ある人を起点に、友達の友達までたどって、その輪に何人いるかを数えたい。

紙の上でやってみると、すぐ困ります。A から B へ、B から C へ、C から A へ戻る。ぐるっと一周して A に着いたので、また B へ進んでしまう。輪があると、たどるだけでは永久に終わりません。仮に終わっても、同じ人を何度も数えてしまいます。

木にはこの問題がありませんでした。親から子への一方通行だったからです。グラフは戻ってこられるので、一度訪れた場所を覚えておく 必要があります。

訪問済みの入れ物 (集合や真偽値の配列) を 1 つ用意して、そこに入っていない相手にだけ進む。これがグラフをたどるときの唯一の約束事です。この章の残りのレッスンでも、ずっとこの約束を使います。

つながりの持ち方

もらった一覧は [[0,1],[1,2],[2,0]] のような「辺の並び」です。この形のままだと「0 の隣は誰か」を調べるたびに全部の辺を見ることになります。 そこで探索の前に「0 の隣は [1,2]」という形へ組み替えるのが定番です (隣接リスト)。 点が少なく辺が密なときだけ、n かける n の表に 0 と 1 を書く隣接行列も使われます。

近いところから、輪を広げる

幅優先探索 (BFS) は、起点のすぐ隣を全部見てから、その次の隣を見る、という順で広がります。池に石を落としたときの波紋と同じで、近いところから外へ広がっていきます。

順番の管理には キュー を使います。先に入れたものが先に出るので、先に入った (つまり近い) 相手から順に処理されます。

Python

from collections import deque rooms = { "受付": ["会議室", "倉庫"], "会議室": ["受付", "廊下"], "倉庫": ["受付"], "廊下": ["会議室"], } def visit_order(start): seen = {start} queue = deque([start]) order = [] while queue: room = queue.popleft() order.append(room) for nxt in rooms[room]: if nxt not in seen: seen.add(nxt) queue.append(nxt) return order

visit_order("受付") は ['受付', '会議室', '倉庫', '廊下'] を返します。受付の隣を 2 つとも先に処理し、そのあとで 1 つ外側の廊下へ進んでいるのが分かります。

deque を使うのは、先頭を取り出す popleft() が速いからです。ふつうの配列で pop(0) と書くと、取り出すたびに全要素がずれるので遅くなります。JavaScript も同じ理由で shift() を避け、取り出し位置の番号を 1 つずつ進める書き方をします。

一覧が [a, b] の形で来ているとき、a の隣に b を足すだけでは足りません。向きのないつながりなので、b の隣にも a を足します。片方だけだと b 側から出発したときに a へ戻れず、1 つの輪が 2 つに割れて見えます。

解説

訪問済みの印は、キューに入れる瞬間 に付けます。取り出すときに付けると、同じ相手が何度もキューに積まれ、処理する回数が膨らみます。

やってみよう

  • n=5, edges=[[0,1],[1,2],[2,0],[3,4]] の絵を紙に描く。輪が 2 つに分かれているのが見えるはず
  • 起点を 0 にしたときと 3 にしたときで、たどり着ける人数が変わることを確かめる
  • 辺が 1 本もないとき、起点自身の 1 人だけが数えられることを確かめる

要件

  1. BFS (幅優先探索) を使って探索すること
  2. 訪問済み集合を用いて同じノードを 2 度処理しないこと
  3. 無向エッジは両方向 (a->b, b->a) を扱えるようにすること

入出力例

bfsComponentSize(5, [[0,1],[1,2],[2,0],[3,4]], 0) → 3 bfsComponentSize(5, [[0,1],[1,2],[2,0],[3,4]], 3) → 2 bfsComponentSize(3, [], 0) → 1 bfsComponentSize(4, [[0,1],[1,2],[2,3]], 0) → 4 bfsComponentSize(5, [[0,1],[0,2],[0,3],[0,4]], 2) → 5 bfsComponentSize(6, [[0,1],[1,2],[3,4],[4,5]], 4) → 3

ヒント

エッジリストをまず隣接リスト (各ノードごとの隣接配列) に変換すると扱いやすい

Python は deque、JS は配列 + head インデックスでキューを実装するのが定石

ノードをキューに入れる瞬間に visited にマークすると、二重追加を防げる

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • グラフ DFS で連結成分の数を数える

    深さ優先探索 (DFS) を使って、グラフに含まれる連結成分の個数を求める関数を実装する。

  • グラフのパス存在判定

    始点と終点が与えられたとき、その間にパスが存在するかを真偽値で返す関数を実装する。

  • BFS で最短経路の長さを求める

    重みなし無向グラフで、BFS を使って始点から終点までの最短経路 (辺数) を求める関数を実装する。

  • トポロジカルソート

    有向非巡回グラフ (DAG) のノードを、すべての辺 u->v で u が v より前に来るように並べた配列を返す。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • グラフノード(頂点)とエッジ(辺)で構成されるデータ構造。
  • 配列サイズ固定の同型データの集まり
  • リスト順序付きで複数の値を扱うデータ構造
  • キュー先入れ先出し(FIFO)のデータ構造
  • 処理計算や代入を表す長方形
  • JavaScriptWeb で動的な振る舞いを担う言語
main.py
学習モード
エディタを読み込んでいます

メモ

グラフ BFS で連結成分サイズを求める

⌘S で保存