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\),则无解。

posted @ 2021-07-20 12:00  zhi_kong  阅读(61)  评论(0)    收藏  举报