1. 程式人生 > 其它 >ABC 210 E

ABC 210 E

題意

\(n\) 個點,\(m\) 種加邊的方法,每種方法給定 \(a_i\)\(c_i\),可將 \(x\)\((x+a_i)\bmod n\) 連邊,其中 \(x\in[0,n)\),代價為 \(c_i\)。求使 \(n\) 個點連通的最小代價。

題解

要使圖連通且代價最小,最終一定是一棵樹,只需要求 MST 就行了。

類似 Kruskal 演算法,我們可以把 \(m\) 種方法按 \(c_i\) 排序,然後用第 \(1,2…m\) 種方法一直連邊,直到不能連為止,這樣一定是最優的。但由於 \(n\) 很大,所以需要再優化。

\(x_i\) 表示用前 \(i\) 種方法連邊連完後所形成的連通分量的個數,則 \(x_{i-1}-\ x_i\)

表示用第 \(i\) 種方法所連的邊數,其中 \(x_0=n\),所以答案為:
\(\sum_{i=1}^mc_i(x_{i-1}-\ x_i)\)

考慮如何求出 \(x_i\)

轉化一下連邊的方法。使用前 \(i\) 種方法時,點 \(v\) 能與 \(u\) 在同一連通分量內當且僅當\(\exists\) \(k_1,k_2,…,k_i\in\mathbb{Z}\) 使得

\[u \equiv v+k_1a_1+k_2a_2+…+k_ia_i (\bmod\ n) \]\[\begin{aligned} &\Leftrightarrow u=v+k_0n+k_1a_1+k_2a_2+…+k_ia_i \end{aligned} \]

\(d_i=\gcd(n,a_1,a_2,…,a_i)\)

\(u=v+kd_i \Leftrightarrow u \equiv v (\bmod\ d_i)\)

所以 \(n\) 個點按模 \(d_i\) 的餘數分成了 \(d_i\) 個連通分量,\(x_i=d_i\)

然後將 \(x_i\) 帶入原式即可求解,
\(x_m\) 不等於 \(1\),則無解。