ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

ABC073 D - joisino's travel

問題
提出コード
典型+久々につかう知識問題。

解法

まずは、頂点数が200しかないので、O(N^3)が間に合います。ので、とりあえずワーシャルフロイド法を適用し、それぞれの頂点間の距離の最小値を求めておきます。
そして、通りたい頂点数は8しかないので、全探索が間に合います。ので、c++であれば、next_permutationを利用して、順列を1つ1つ作成し、その順番に頂点を通った場合の距離を先ほどのワーシャルフロイド法によって求めた値から計算して、最小値の更新を行っていけば、答えがもとまります。
next_permutationを行うときはdo-while文を利用するといいかと思います。通る頂点をあらかじめ昇順でソートしておくことや、ワーシャルフロイド法を適用するにあたって初期化が\inftyであること、0-indexedか1-indexedかの確認など、基本的な部分に注意しましょう。