Kazun の競プロ記録

競技プログラミングに関する様々な話題を執筆します.

AtCoder Beginner Contest 270 F問題 Transportation

問題

atcoder.jp

提出解答

atcoder.jp

問題の概要

AtCoder 国は  N 個の島からなる島国である. 最初, どの島にも空港, 港はなく, どの2つの島の間にも道路はない.

次のことをそれぞれ好きなだけ行うことができる.

  •  1 \leq i \leq N なる整数  i を選び,  X_i 円支払って 島  i に空港を建設する.
  •  1 \leq i \leq N なる整数  i を選び,  Y_i 円支払って 島  i に港を建設する.
  •  1 \leq j \leq M なる整数  i を選び,  Z_j 円支払って 島  A_j と島  B_j の間に道路を建設する.

以下の行動を繰り返すことによって島  U から島  V へ移動できるとき, 島  U から島  V へ移動可能であるという.

  •  S と島  T ともに空港がある場合にのみ可能: 島  S から島  T へ移動する.
  •  S と島  T ともに港がある場合にのみ可能: 島  S から島  T へ移動する.
  •  S と島  T を直接結ぶ道路がある場合にのみ可能: 島  S から島  T へ移動する.

任意の2つの島の間を移動可能にするために必要な最小費用を求めよ.

制約

  •  2 \leq N \leq 2 \times 10^5
  •  1 \leq M \leq 2 \times 10^5
  •  1 \leq X_i \leq 10^9
  •  1 \leq Y_i \leq 10^9
  •  1 \leq A_j \lt B_j \leq N
  •  1 \leq Z_j \leq 10^9
  •  j \neq j' \Rightarrow (A_j, B_j) \neq (A_{j'}, B_{j'})

解法

次のような (重み付き) 無向グラフ  G=(V,E) を考える. ただし,  A,P は形式的につける頂点とする *1.

  •  V:=\{1,2, \dots, N, A, P\}
  •  E:=\{A_j  B_j \mid j=1,2, \dots, M\} \cup \{i A \mid i=1,2, \dots, N \} \cup \{i P \mid i=1,2, \dots, N\}

このようにすることで, それぞれ以下が成り立つ.

  • 空港を利用して島  S から島  T へ直接移動可能  \iff SA, AT \in E.
  • 港を利用して島  S から島  T へ直接移動可能  \iff SP, PT \in E.

よって, この問題は  G において頂点  1,2, \dots, N を連結にするために必要な残す辺の重みの総和の最小値を求める問題に帰着された. ここで, 頂点  A,P に対する連結性については言及されていないことから,  2^2=4 通りの場合分けをすることにする.

すると, 各問題は次のようにして帰着される.

  •  A,P ともに頂点  1,2, \dots, N と連結しない場合  \cdots 無向グラフ  G-\{A,P\} における最小全域木問題.
  •  A は頂点  1,2, \dots, N と連結しないが, 頂点  P 連結する場合  \cdots 無向グラフ  G-\{A\} における最小全域木問題.
  •  P は頂点  1,2, \dots, N と連結しないが, 頂点  A 連結する場合  \cdots 無向グラフ  G-\{A\} における最小全域木問題.
  •  A,P ともに頂点  1,2, \dots, N と連結する場合  \cdots 無向グラフ  G における最小全域木問題.

これら4パターンにおける最小全域木問題をとき, 最小値を答えれば良い. なお, 全域木がとれないパターンについては  +\infty とすればよい.

計算量は  G のオーダーが  (N+2), サイズが  (2N+M) であるから,  O( (N+M) \log (N+M) ) 時間である.

*1:それぞれ airport, port の頭文字