ソート




原案、問題文:宮村
解答:宮村、橋本
 解説:宮村
問題概要


   配列を値の交換によってソートしたい。
   i と j を交換するのに C[i][j] のコストが必要になる。
   順列 p をソートするのに必要な最小コスト =: f(p)
   f(p) の最大値を求める。
着眼点

   f(p) を効率よく求めるのは案外大変
    ( 参考 : Silly Sort )
   最も愚直にコストを求めるには、 p からソートされた
    状態へ Dijkstra を使う。
   f(p) を求めるのに N! 程度のコストが必要になり、
    全ての p について求めると (N!)^2 で TLE する。
   逆に、ソートされた状態からの距離を考えれば
    Dijkstra を 1 回行うだけでよい。
解法



   N! 通りの全ての順列をノードとするグラフを考える。
   ソートされた順列を始点として Dijkstra 法などで各
    ノードまでの距離を求める。
   距離の最大値が答えとなる。
グラフとして見る


0, 1, 2      0, 2, 1             1, 0, 2




1, 2, 0      2, 0, 1             2, 1, 0




                       C[0][1]
                       C[0][2]
                       C[1][2]
実装

   各順列までの距離をどのようなデータ構造で持つ
    か?
    1. 連想配列で配列をキーにする
    2. 順列をビット列に落とす (3 * 7 bit あれば十分 )
    3. 順列に対する最小完全ハッシュ関数を利用す
       る ( 変換に N^2 かかるのがネック )
   1 や 3 だと実装次第で TLE することもあるようで
    す。定数が重いとかではなく計算量が増加します。
解答例

   宮村 (C++)
    95 行 1644 byte


   橋本 (Java)
    90 行 1800 byte

Sort

  • 1.
  • 2.
    問題概要  配列を値の交換によってソートしたい。  i と j を交換するのに C[i][j] のコストが必要になる。  順列 p をソートするのに必要な最小コスト =: f(p)  f(p) の最大値を求める。
  • 3.
    着眼点  f(p) を効率よく求めるのは案外大変 ( 参考 : Silly Sort )  最も愚直にコストを求めるには、 p からソートされた 状態へ Dijkstra を使う。  f(p) を求めるのに N! 程度のコストが必要になり、 全ての p について求めると (N!)^2 で TLE する。  逆に、ソートされた状態からの距離を考えれば Dijkstra を 1 回行うだけでよい。
  • 4.
    解法  N! 通りの全ての順列をノードとするグラフを考える。  ソートされた順列を始点として Dijkstra 法などで各 ノードまでの距離を求める。  距離の最大値が答えとなる。
  • 5.
    グラフとして見る 0, 1, 2 0, 2, 1 1, 0, 2 1, 2, 0 2, 0, 1 2, 1, 0 C[0][1] C[0][2] C[1][2]
  • 6.
    実装  各順列までの距離をどのようなデータ構造で持つ か? 1. 連想配列で配列をキーにする 2. 順列をビット列に落とす (3 * 7 bit あれば十分 ) 3. 順列に対する最小完全ハッシュ関数を利用す る ( 変換に N^2 かかるのがネック )  1 や 3 だと実装次第で TLE することもあるようで す。定数が重いとかではなく計算量が増加します。
  • 7.
    解答例  宮村 (C++) 95 行 1644 byte  橋本 (Java) 90 行 1800 byte