B - Long Increasing Walk 解説
by
maspy
必要条件を満たす \(K\) に対する構築方法について述べます.
グラフの辺集合を,次のように完全マッチングに分割できます.
- マッチング \(t\):\((x, (x+t)\bmod N)\) を結ぶ辺全体.
さらにマッチング \(2t,2t+1\) を合わせるとサイクルになります.
\(N\) が偶数のとき
辺集合を,\(m = N/2\) 個のサイクルに分割します. \(k\) 番目のサイクルには区間 \([2Nk, 2N(k+1))\) の値を割り当てることを前提とします.すると,作るべきウォークはサイクル内のウォークを結合したものとして書けます.
これの長さが \(K\) になるように調整します.各サイクルでの長さを \((2N,2N,\ldots,2N, x, 2, 2, 2, \ldots)\) のように割り当てます.
\(2N\) の部分は,サイクル上で長さ \(2N\) のウォーク \(0\to 0\) がとれるようにします.
\(2\) の部分は,サイクル上の重みが \(0,N,1,N+1,2,N+2,\ldots\) のような感じに並ぶように調整すると,どこからスタートしても最大長さ \(2\) のウォークがとれるようにできます.
あとは \(x\) の部分です.要するにサイクルの辺に重みを付けて,重みが増大するパスの最大長が \(x\) かつ始点 \(0\) のときになるようにすればよいのです.これは簡単にできます.
\(N\) が奇数のとき
同じように完全マッチング \(2t,2t+1\) を合わせることで,辺集合を,\(((N-1)/2)\) 個のサイクルと完全マッチング \(1\) つに分割できます.
最後にひとつ余っている完全マッチング部分で長さ \(1\) のウォークが追加することを除き,偶数のときとほぼ同じ構築が可能です.
投稿日時:
最終更新: