Codeforces Round #699 (Div. 2) D. AB graph
あらすじ
Graphvizの練習
問題概要
頂点の完全有向グラフが与えられる。
各辺には"a"または"b"というラベルがついている(辺のラベルは異なる場合もある。)
このグラフ上の経路で、通った辺のラベルをその順につなげたときに長さの回文になるようなものはあるか。
あれば構築して出力し、なければ"NO"と答える。
同じ辺を何回通過してもよい。
(本当はマルチケースだけど省略)
解法
問題ページにも太字で表記されていましたが同じ辺を何回通過してもいいというのがかなり考察を簡単にしてくれます。
以下、自明なパターンから場合分けを潰していきます。
出入りのラベルが々頂点対が一つでもあれば、まずこれですべてが解決です 一種類の文字だけでできた文字列は回文になります。
ということで以降はすべての頂点対は出入りでラベルが異なるとして考えます この場合でも、mが奇数の場合は2頂点を行き来するだけで解決します
さてが偶数の場合は2頂点では無理なので3頂点を使います。
グラフ上の任意の3頂点を見たとき、(すべての頂点対で出入りのラベルが異なると仮定しているので、)以下のどちらかの関係になるはずです。
前者はaのラベルを辿ってループするだけで良いので終了です。
後者の場合はもう一つ場合分けをします。
- m % 4 == 0 の場合
- "abba" を複数回繋げて終了
- そうでない場合(残りは 6, 10, 14 ... 4k + 2)
- "aabb" をk回繋げた後"aa"で蓋をして終了
です。
あと最後にまだ考慮していなかったのが「頂点が2つしかなくてラベルが違う、かつmが偶数の場合」ですが、この場合のみNOになります。
まとめ
u->vとv->uで同じラベルの頂点(u, v)がある -> 一生往復 〇 |- mが偶数 -> 一生往復 〇 |- 頂点が二つ -> × |- 頂点1, 2, 3を見たとき、同じラベルだけで巡回できる -> 一生巡回 〇 |- m % 4 == 0 -> abbaabba ... abba 〇 |- m % 4 == 2 -> aabbaabb ... aabbaa 〇
です。
計算量は、一度全頂点対を調べる必要があるのとまあ長さmの経路を構築しなければならないので O() になります。たぶん
雑感
考察していた時はギャグのタイプの問題かなと思っていたけどまとめていたら結構場合分けが面倒で、沼にハマらずに通せたのは割とよかったなと思います。
codeforcesで腕力を鍛えよう