この記事で使うアルゴリズム
深さ優先探索
はじめに
カテゴリー競プロ初中級者100問では、Qiita
にて@e869120
さんがレッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編:目指せ水色コーダー!】としてまとめられている100問をPython
で解いています。
全問題の一覧はこちらです
問題
https://atcoder.jp/contests/abc138/tasks/abc138_d
この問題は深さ優先探索を用いて解くことができます。
深さ優先探索はスタックや再帰関数によって実装できます。今回は再帰関数を用います。
方針
操作
の際の根に当たるノードのカウンターV
に先に値を加算する。- 深さ優先探索を行いながら、親ノードのカウンターの値を加算していく。
- 深さ優先探索では
link
を参照してノードを追加します。- この時、親ノードを追加して無限ループとならないように除外します。そのために
parent
で親ノードを記憶しています。
- この時、親ノードを追加して無限ループとならないように除外します。そのために
- 深さ優先探索では
- 最後にカウンター
V
の値を文字列結合して出力する。
ポイント
入力行数が多いので高速化が必要です。
1 | input = sys.stdin.readline |
デフォルト値だと小さすぎるので、再帰処理の上限を引き上げる。
1 | sys.setrecursionlimit(int(1E+7)) |
コード(全体)
1 | import sys |
記事情報
- 投稿日:2020年4月15日
- 最終更新日:2020年5月8日