1196. Bridge Removal
問題
木が与えられる。
木の辺を以下のルールで削除していく。
・最初にどこかのノードを決める
・ノードから辺を渡って別のノードへ移動する
・今いるノードにつながる辺を一つ削除し、今いるノードにとどまる
辺が無いノードには移動できない。
削除や移動にかかるコストは、辺の重みであるとき、すべての辺を削除する最小コストを返す。
考え方
葉ノードは、渡らずにその一つ手前のノードで削除すればよい。
葉ノード以外の部分について、考えると、木の直径(一番パスのコスト合計が大きい2ノード、最遠頂点対間距離)のパス(xノード間の辺)は「通って削除」で押さえて、直径パスじゃないところ(oノードに移動する辺)は、「行って戻って削除」するのが最小になる。
よって、求める最小コストは、葉ノードにつながる辺コスト+2*直径+3*(直径以外の辺コスト合計)になる。
o | x-x-x-x-x 直径 | o | o
木の直径は、(たぶん)全点間最小距離を求めても大丈夫かもしれないが、double sweep法という、ある頂点から一番遠い点を求めて、さらにその点から一番遠い点を求めると、二回目に求めた2点が直径になっているというアルゴリズムだと、全部の辺を一回だけしか通らなくて済むのでO(E)で求められる。