ARC225 C - K Spanning Tree

K全域木

考え方

まず、重みの上限と下限を考える。

重みの下限は、重み $1$ の辺を最低限いくつ使わなければならないかである。
つまり、重み $0$ の辺だけで Union-find 木を作り、連結成分数 $-1$ がその答えである。
また、その重みの全域木を作れるかという問いにも、簡単に作れるといえる。
重み $0$ の辺でできた連結成分ごとに木を作り、その森を重み $1$ の辺で連結すればいい。

重みの上限は、重み $0$ の辺について同様に考えればよい。

さて、では下限が $L$ で上限が $U$ だった場合に $L \leq x \leq U$ の範囲の重み $x$ の全域木が全て作れるか?
これは、可能である。
以下、証明。

重み $L$ である全域木を $G_1$、重み $U$ である全域木を $G_2$、とする。
これらが作れることは証明済である。

最初のグラフとして、$G_1$ を用意する。
ここに、グラフが $G_2$ に一致するまで以下を繰り返す。

この操作は $G_2$ に一致するまで続けることができ、重みは一度に最大 $1$ しか増減しない。
したがって、$L \leq x \leq U$ の範囲の重み $x$ の全域木は全て作れる。

これで、"Yes" か "No" かで答える問題であれば解けた。
さて、では実際の構築を考える。
もちろん上の方法を実装できるならそれでもよいが、おそらく非常に難しい。

ということで、作れることがわかっている前提での作り方を実行する。

まず、重み $0$ の辺だけで Union-find 木を作ったとき、重み $1$ の辺が最低何本必要か考えた。
その最低限の個数の重み $1$ の辺の組の例を $1$ つ作り、それらの辺を全て採用する。
重み $1$ の辺だけで Union-find 木を作ったとき、重み $0$ の辺が最低何本必要かも考えた。
その最低限の個数の重み $0$ の辺の組の例を $1$ つ作り、それらの辺を全て採用する。

この時点で、$K$ が作れる範囲の数であれば、重さ $0$ の辺も重さ $1$ の辺も個数が超過はしていない。
そして、残った連結成分は、重み $0$ の辺だけでも、重み $1$ の辺だけでも、他の連結成分と連結できる。
ということは残りは、各重みの残り本数に気をつけて、連結成分を新しく結べる辺を自由に選んでよい。
重み $0$ も重み $1$ も、全体の重みを $K$ にするための規定本数になったら構築終了。

計算量は、1ケース当たり $O(M\alpha(N)+N\log N)$ である。

入力例1での動作

入力例1の $1$ つ目のテストケースのみ考える。

入力を受け取り、辺の両端を 0-indexed に直す。

n: 4
m: 5
k: 2
edges:
0: (0, 1, 0)
1: (0, 2, 0)
2: (1, 2, 0)
3: (3, 1, 1)
4: (3, 2, 1)

重み $0$ の辺だけで見た連結成分は $\{0,1,2\},\{3\}$ である。
したがって、重み $1$ の辺が最低 $1$ 本必要である。

重み $1$ の辺だけで見た連結成分は $\{0\},\{1,2,3\}$ である。
したがって、重み $0$ の辺も最低 $1$ 本必要である。

各重みだけで見た連結成分

全域木は $3$ 本の辺からなる。
よって、その重みの合計は $1$ 以上 $2$ 以下にできる。
今回は $K=2$ なので構築可能である。

まず、各重みで最低限必要な辺を確保する。

重み $0$ の辺では、辺 $0$ が重み $1$ の辺だけでは別成分の頂点 $0,1$ を結ぶ。
よって、辺 $0$ を採用する。

重み $1$ の辺では、辺 $3$ が重み $0$ の辺だけでは別成分の頂点 $3,1$ を結ぶ。
よって、辺 $3$ を採用する。

この時点で採用した辺は $0,3$ で、連結成分は $\{0,1,3\},\{2\}$ である。
重み $0$ の辺は必要な $1$ 本を使い切り、重み $1$ の辺はあと $1$ 本使う必要がある。

最低限必要な辺を採用した状態

残りの成分を、重み $1$ の辺で結ぶ。
辺 $4$ は頂点 $3,2$ を結ぶので採用できる。
これで全頂点が連結になり、採用した辺は $0,3,4$ となる。

全頂点を連結にした状態

辺番号を 1-indexed に戻すと、$1,4,5$ を出力すればよい。

注意点

特になし。

別解

特になし。