0Pricing
Competitive Programming Academy · レッスン

Deque による 0-1 BFS

重みが 0 または 1 のときの最短経路を求めます

「Deque による 0-1 BFS」はCoddyKit上の無料Competitive Programming Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCompetitive Programming Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Competitive Programming Academyコースには全4レッスンが含まれています。

特殊な種類のグラフ

辺の重みが0または1だけのグラフもあります。その場合は、より簡単で高速な方法によってDijkstraを上回れます。

0-1 BFSを使う

0-1 BFSは、0または1の重みを持つグラフで最短経路を線形時間で求めます。ヒープも対数係数も必要ありません。

使う道具:deque

ヒープをdequeに置き換えます。dequeは、先頭と末尾の両方から要素を追加・削除できるキューです。

from collections import deque
dq = deque([src])

核心となる考え方

重み0の辺では距離が変わらず、重み1の辺では1増えます。dequeはこの2つのグループを順序どおりに保ちます。

重み0の辺は先頭へ

重み0の辺を通った場合は、隣接ノードをappendleftします。追加の距離がかからないため、次に処理する必要があるからです。

dq.appendleft(v)

重み1の辺は末尾へ

重み1の辺を通った場合は、隣接ノードを末尾にappendします。始点から1層遠い位置にあるためです。

dq.append(v)

先頭から取り出す

現在のノードは必ずpopleftします。層ごとに探索するBFSと同じように、dequeを距離順に保てます。

u = dq.popleft()

重みを使って緩和する

各辺を緩和します。新しい距離は dist[u] と辺の重みの合計とし、その重みに応じて先頭または末尾に追加します。

nd = dist[u] + w
if nd < dist[v]:
    dist[v] = nd

順序が保たれる理由

dequeには、同時に異なる距離が最大2種類だけ入ります。この不変条件があるからこそ、先頭と末尾への追加が機能します。

線形時間の高速さ

ヒープを使わないため、0-1 BFSの計算量はO(V + E)です。同じグラフなら、Dijkstraより明らかに高速です。

使うべき場面

移動のコストが0または1のときに使います。たとえば、一部の移動が無料で、他の移動に1のコストがかかるグリッドなどです。

確認問題

重み0の辺を通って隣接ノードを緩和した場合、そのノードはどこに入れますか?

まとめ:0-1 BFS

dequeを使い、重み0の辺は先頭に、重み1の辺は末尾に追加します。O(V+E)という明快な線形時間で最短経路を求められます。⚡

よくある質問

「Deque による 0-1 BFS」レッスンは無料ですか?

はい。「Deque による 0-1 BFS」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Competitive Programming Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Competitive Programming Academyコースには全4レッスンが含まれています。

「Deque による 0-1 BFS」で何を学びますか?

重みが 0 または 1 のときの最短経路を求めます ブラウザで直接実行するハンズオンコードでCompetitive Programming Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Competitive Programming Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのCompetitive Programming Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「Deque による 0-1 BFS」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このCompetitive Programming Academyレッスンでコードを書いて実行できますか?

はい。すべてのCompetitive Programming Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ヒープを使う Dijkstra 法
  2. Deque による 0-1 BFS
  3. Bellman-Ford と負辺
  4. Floyd-Warshall 全点対最短経路
← Competitive Programming Academyに戻る