めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

Union-find をグラフ探索で代替できる例

何の話かと言うと

要素をグループ分けする問題で、よく Union-Find がテクニックとして取り上げられますが、もうちょっと単純に、同じグループの要素に双方向リンクを貼っていって、最後に、グラフ探索で同じグループの要素をまとめるという手法で間に合う場合もあります。

例1 : D - Equals

atcoder.jp

互いに入れ替え可能な位置を同一グループと見なします。その後、「整数 P_i の位置 i が位置 P_i と同じグループに入っている」という条件を満たす P_i の個数を数えればOKです。双方向リンクとグラフ探索による実装はこちら。

atcoder.jp

例2 : D - KAIBUNsyo

atcoder.jp

数列に現れる数字をノードとして、ペアになる数字を同じグループに属するものとします。それぞれのグループについて「ノード数 - 1」を計算して、これらを合計したものが答えになります。双方向リンクとグラフ探索による実装はこちら。

atcoder.jp

Union-Find でないと間に合わない例

とは言え、同一グループの探索が何度も走る問題では、Union-Find でないと間に合いません。例えばこちら。

atcoder.jp

グラフ探索による結果

atcoder.jp

Union-Find による結果

atcoder.jp