Official
J - ワープ Editorial
by
J - ワープ Editorial
by
QCFium
町を頂点、道路を辺とすると最短経路問題に近いですが、ワープを再現する辺を愚直に張ると辺の数が \(\Theta(N^2)\) 本になって TLE になります。
ここで以下のような辺の張り方をします。
- 新たな \(6\) つの頂点 \(\mathrm{A_{in}}, \mathrm{B_{in}}, \mathrm{C_{in}}, \mathrm{A_{out}}, \mathrm{B_{out}}, \mathrm{C_{out}}\) を作る。
- すべてのタイプ A のワープ台を持つ町について、その町に対応する頂点から \(\mathrm{A_{in}}\) へ、コスト \(0\) の有向辺を張る
- すべてのタイプ B のワープ台を持つ町について、その町に対応する頂点から \(\mathrm{B_{in}}\) へ、コスト \(0\) の有向辺を張る
- すべてのタイプ C のワープ台を持つ町について、その町に対応する頂点から \(\mathrm{C_{in}}\) へ、コスト \(0\) の有向辺を張る
- \(\mathrm{A_{in}}\) から \(\mathrm{B_{out}}\) へコスト \(X_{\mathrm{AB}}\) の有向辺を張る。
- \(\mathrm{A_{in}}\) から \(\mathrm{C_{out}}\) へコスト \(X_{\mathrm{AC}}\) の有向辺を張る。
- \(\mathrm{B_{in}}\) から \(\mathrm{A_{out}}\) へコスト \(X_{\mathrm{AB}}\) の有向辺を張る。
- \(\mathrm{B_{in}}\) から \(\mathrm{C_{out}}\) へコスト \(X_{\mathrm{BC}}\) の有向辺を張る。
- \(\mathrm{C_{in}}\) から \(\mathrm{A_{out}}\) へコスト \(X_{\mathrm{AC}}\) の有向辺を張る。
- \(\mathrm{C_{in}}\) から \(\mathrm{B_{out}}\) へコスト \(X_{\mathrm{BC}}\) の有向辺を張る。
- すべてのタイプ A のワープ台を持つ町について、 \(\mathrm{A_{out}}\) からその町に対応する頂点 へ、コスト \(0\) の有向辺を張る
- すべてのタイプ B のワープ台を持つ町について、 \(\mathrm{B_{out}}\) からその町に対応する頂点 へ、コスト \(0\) の有向辺を張る
- すべてのタイプ C のワープ台を持つ町について、 \(\mathrm{C_{out}}\) からその町に対応する頂点 へ、コスト \(0\) の有向辺を張る
これが正しくワープを再現していること、頂点数が \(O(N)\) で辺数が合計で \(O(N + M)\) に収まっていることは明らかです。
よってこのグラフ上でダイクストラ法で最短経路長を求めれば、\(O((N + M) \log(N + M))\) で答えが求まります。
posted:
last update:
