求解二維網格圖上的線性方程組:關鍵變數法

6 minute read

關鍵變數法

Description

上個例題 https://codeforces.com/problemset/problem/963/E

有一個人在二維網格圖上隨機上下左右走,一開始在原點 (0,0)(0, 0),每秒有 p1,p2,p3,p4p_1, p_2, p_3, p_4 的機率分別往上下左右走一格,問期望幾秒會走到跟原點距離超過 rr 的點?答案模 109+710^9+7。pi=ai/∑aip_i = a_i/\sum a_i 而 1≤ai≤10001 \leq a_i \leq 1000。

Solution

令 f(i,j)f(i, j) 代表期望走幾步會停下來,則邊界的 f(i,j)=0f(i, j) = 0,而對於內部的 f(i,j)f(i, j) 則有

f(i,j)=1+p1f(i−1,j)+p2f(i+1,j)+p3f(i,j−1)+p4f(i,j+1) f(i, j) = 1 + p_1 f(i - 1, j) + p_2 f(i + 1, j) + p_3 f(i, j - 1) + p_4 f(i, j + 1)

因為變數之間依賴的關係有環所以不能簡單的用 DP 求解。高斯消去要花 O(n3)\mathcal{O}(n^3) 的時間求解,其中 nn 是變數數量,也就是大約 πr3\pi r^3 個,所以總共是 O(r6)\mathcal{O}(r^6)。官解是利用類似 band matrix 的性質做到 O(r4)\mathcal{O}(r^4)。

但其實可以做更好!圓內部的格子點共有 O(r)\mathcal{O}(r) 個橫排,我們令每個橫排最左邊的變數是關鍵變數 x1,x2,…,xkx_1, x_2, \dots, x_k,則每個變數都可以表示成關鍵變數的線性組合,方法是利用以下等式

f(i,j+1)=1p4(f(i,j)−1−p1f(i−1,j)+p2f(i+1,j)+p3f(i,j−1)) f(i, j + 1) = \frac{1}{p_4} \left( f(i, j) - 1 - p_1 f(i - 1, j) + p_2 f(i + 1, j) + p_3 f(i, j - 1) \right)

等式右邊每個 ff 都是 kk 個關鍵變數的某個線性組合,因此推出來的等式左邊也是 kk 個關鍵變數的線性組合。可以自然的從左往右推出每個位置,每個位置會花 O(r)\mathcal{O}(r) 計算,而位置的數量是 O(r2)\mathcal{O}(r^2),總共只要花 O(r3)\mathcal{O}(r^3) 就可以計算出每個位置怎麼用關鍵變數表示。一路推到右邊的邊界之後就會得到 O(r)\mathcal{O}(r) 個等式,這樣我們就只要求解一個長跟寬都是 O(r)\mathcal{O}(r) 的矩陣了。直接高斯消去就是 O(r3)\mathcal{O}(r^3)。

Generalization

IOIC 某天某一題也是這種在二維網格圖上 markov chain 的題(不過不是上下左右動而是在類似三角形的 lattice 上動?Z[e2πi3]\mathbb{Z}[e^{\frac{2\pi i}{3}}] 之類的?),官解一樣給的是 band matrix 的解法。一樣可以令三角形內部最靠邊界的一排當作關鍵變數,就可以在 O(r3)\mathcal{O}(r^3) 求解了,其中 rr 是三角形邊長。

這個方法意外的很難推廣?若網格當中存在障礙物或是有邊權為 00 的情況,我們就沒辦法往右推出那個變數,需要把那個變數當作新的關鍵變數。

去查了一下還能不能做更好,查到 refernce 那兩篇(一篇又是 tarjan)。
對於(允許障礙物、邊權為 0 的)網格圖可以用 nested disection 花 O(N3/2)\mathcal{O}(N^{3/2}) 得到一個只有 O(Nlog⁡N)\mathcal{O}(N\log N) 個非零元素的矩陣分解,其中 NN 是總變數數量;而 tarjan 又加強這個結果到任何有好的 separator 的圖,在任何一般的平面圖上因為有 Planar separator theorem 應該可以做得跟上述複雜度一樣好。反正查一查應該沒有查到本文中寫的方法,本文中應該只是一個足夠簡單到可以在競程比賽當中推出來的一個 trick 而已。

Reference