Open6

競プロ問題考察

Hidden comment
Hidden comment
Hidden comment
masato_is_a_ snakemasato_is_a_ snake

執筆時間 180 + 180 = 360 + 22 => 380分
https://algo-method.com/tasks/414

記事概要

  • 幅優先探索(BFS)を用いた問題の方針と実装内容の解説を記載します。

対象読者

  • BFSを用いた問題の知見がない方

問題概要

無向グラフが合って、以下のルールに従って色を塗っていく。
操作をk = 0...N-1回行う。

  1. k = 0なら頂点 0 に色を塗る。
  2. k \neq 0 なら i-1回目で色が塗られた頂点と繋がっていて、かつまだ色が塗られていない頂点に色を塗る。
    色が塗られた頂点を番号が小さい順にすべて出力する。

実装方針

こういった無向グラフを走破するやり方として幅優先探索(BFS)、深さ優先探索(DFS)で探索することが一般的。今回はBFSで解く。
なぜキューを用いた方が良いか?GhatGPTより

キューを用いた方が良い理由は、BFSの探索が「幅優先」であるためです。キューを使うと、最も探索が浅いノードから順に順番に処理され、探索の順序が自然に決まります。具体的な利点は以下の通りです:
シンプルで直感的なコード:キューを使うと、各ステップで処理するノードの順序を一貫して管理できるため、余計な処理(nodes[k]のような一時的な配列を用意する)が不要になります。
効率性の向上:キューに基づく実装では、「探索が浅いノードを先に処理する」性質が自然に維持されるため、探索範囲が増えても適切な順序で各ノードを処理できます。

幅優先探索(BFS)とは?

幅優先探索とは、現在のノードの隣接ノードをすべて訪れた後、次の層のノードに進む探索方法のこと
こちらでキャッチアップ中

https://zenn.dev/link/comments/40393df1f6cb7e

提出コード

キューを使用していないコード
https://algo-method.com/tasks/414/submissions/1554288

キューを用いたコード
https://algo-method.com/tasks/414/submissions/1558603

補足

入力を与えると無向グラフを作成してくれるツールが非常に便利
https://csacademy.com/app/graph_editor/

masato_is_a_ snakemasato_is_a_ snake

https://atcoder.jp/contests/abc138/tasks/abc138_d

考えたこと

BFSの計算量はO(N)、よってクエリの回数分やるとなるとO(NQ)で間に合わない。
なんとなく、最後にまとめて足し算していけばいいことは分かるが具体的なやり方が見えていない。

幅優先探索1回とクエリの計算でO(N+Q)になるのが望ましい。

解説見た

DFSを用いていたので飛ばし