CF 701 F - Break Up
問題
問題概要
頂点辺の無向グラフがある。グラフが連結である保証はない。
いま、ある辺を削除して頂点から頂点への移動をできなくなるようにすることを考える。しかし、辺の削除の上限は2本である。辺にはそれぞれ削除のコストがついている(とする)ので、削除のコストが最小になるように削除した時の、そのコストと、その時に削除する辺はどれになるかを答えよ。ただし、不可能な場合には-1とだけ答えよ。
アイデア
まず、もとのグラフでとがもともと繋がっていなければ答えは0になる。以下、つながっている場合を考える。
もし、1つの辺の削除によってとを連結でなくすることが可能なら、その辺はからへのあらゆるパスに含まれることになる。よって、二重辺連結成分分解によって橋をみつけて、からへのある1つのパス上を眺めてそのパス上にある橋のコストをみていけば良い。
2つの辺を削除してとの連結を切ることを考えるとき、削除する辺のうちの1つは見つかった1つのパス上になければならない(でないとそのパスを使うことが出来るから)。パス上のある辺を削除したと考えると、この1つの辺を削除したグラフに対して橋を見つけて、あるパス上の橋を削除すべきということになる。
このいずれでも不可能な時は-1と答えることになる。
実装(C++)
続きを読むCF 701 E - Connecting Universities
問題
問題概要
頂点数の木があり、頂点にはからの番号が振られている(グラフの情報は、各辺がどの頂点を繋いでいるかが与えられる)。このうち、個の頂点番号が指定される。それらをとする。これら個の頂点から、個のペアを作る。そのペアの木における距離の総和を最大化するようにペアを作った時、その総和の値を求めよ。
アイデア
頂点を根として考える。すると、DFSによって次の値を各頂点に対して求めることが出来る:
- : 頂点iを根とした部分木以下にある指定されている頂点の個数(自分も含む)
最適なペアを取ることの出来る状況を考えてみる。
そこで、頂点とその親の間にある辺を考えてみると、その辺は個のペアのパス上にあることになると言える。これはなぜかというと、まず、これ以上のペアのパス上になることは、この辺を挟んだ位置にあるそれぞれの頂点の個数を考えてみると、物理的に有り得ない。逆にこれ未満である状況を考えると、を根とする部分木の中にある頂点同士とがペアになっており、その部分木には含まれない頂点同士とがペアになっているということになる。そして、木の性質上、このペアをと、とに変えることでからへのパス上の辺とからへのパス上の辺を全てカバーでき、かつパスを長くすることが出来る組み合わせなのでこのような組み合わせは最適ではないことが分かり、上記のことは正しいということが分かった。
ということで、結論はということになる。
そのようなマッチングを求めることもそんなに改変しなくてもできるよって書いてあるけど、パッとは思いつけない…