TUATPC2024Summer (Algorithm)
コンテスト日時
2024/09/26 (Th) 20:00 - 23:00

H - Second Shortest Path in Pseudotree

Ceylon
2
s
1024
MB
250

問題文

$N$ 頂点 $N$ 辺の単純連結無向グラフ $G$ が与えられます。

頂点には $1, 2, \dots, N$ の番号が、辺には $1, 2, \dots, N$ の番号が付けられており、辺 $i$ は頂点 $u_i, v_i$ を結んでいます。また、$G$ の単純パスの長さを単純パスに含まれる辺の本数と定義します。

$1$ 以上 $N$ 以下の整数 $A, B$ が与えられます。$G$ において、頂点 $A$ から頂点 $B$ への単純パスのうち、$2$ 番目に短い単純パスの長さを求めてください。ただし、そのような単純パスが存在しない場合はその旨を報告してください。
ここで、同じ長さの単純パスが複数存在する場合、それらは互いに区別されます。

より厳密には、次の問題に答えてください。

$G$ の頂点 $A$ から頂点 $B$ への単純パスの個数を $M$ とする。$M < 2$ であるとき -1 を出力せよ。
そうでなければ、それぞれの単純パスの長さを昇順に並べた長さ $M$ の数列を $L = (L_1, L_2, \dots, L_M)$ としたとき、$L_2$ を出力せよ。

$Q$ 個の整数の組 $(A_1, B_1), (A_2, B_2), \dots, (A_Q, B_Q)$ が与えられるので、$(A, B) = (A_1, B_1), (A_2, B_2), \dots, (A_Q, B_Q)$ についてそれぞれ答えを求めてください。

単純連結無向グラフとは

単純連結無向グラフとは、次の条件をすべて満たすグラフ $G$ のことを指します。

  • 自己ループ(同一の頂点を結ぶ辺)や多重辺(ある $2$ 頂点を結ぶ $2$ 本以上の辺)が存在しない。
  • どの $2$ 頂点間も何本かの辺を使って互いに移動することができる。
  • 辺に向きが存在しない。
単純パスとは

単純パスとは、グラフ $G$ における頂点の列のうち、各頂点間に辺が存在し、同一の頂点を含まない列のことを指します。

より厳密には、次の条件をすべて満たす頂点列 $V = (v_1, \dots, v_n)$ のことを指します。

  • $1 \le i \le n - 1$ について、$G$ に頂点 $v_i$ と頂点 $v_{i+1}$ を結ぶ辺が存在する。
  • $i \ne j$ ならば $v_i \ne v_j$ が成り立つ。

制約

Hard (125点)

  • $3 \le N \le 10^5$
  • $1 \le u_i < v_i \le N$
  • $G$ は単純かつ連結
  • $1 \le Q \le 10^5$
  • $1 \le A_i, B_i \le N$
  • $A_i \ne B_i$
  • 入力はすべて整数

Normal (25点)

  • Hard の制約に以下の制約を追加
  • $Q = 1$

Easy (100点)

  • Hard の制約に以下の制約を追加
  • $1 \le i \le N - 1 \Rightarrow u_i = i, v_i = i + 1$
  • $u_N = k \quad (1 \le k \le N - 2), v_N = N$
  • $Q = 1$
  • $A_1 = N$
  • $1 \le B_1 \le N - 1$
部分点のみ解答したい場合

部分点のみを解答したい場合、問題によっては結果が TLE となるケースが大量に発生し、ジャッジに時間がかかる可能性があります。

C++の assert 関数やPythonの assert 文などを用いて、変数の値によってプログラムを強制終了させる処理を書き加えることで TLE を防ぎ、より早く結果を得ることができます。

入力

入力は以下の形式で標準入力から与えられます。

$N$
$u_1 \ \ v_1$
$\ \vdots \ \ \ \ \ \vdots$
$u_N \ \ v_N$
$Q$
$A_1 \ \ B_1$
$\vdots$
$A_Q \ \ B_Q$

出力

$Q$ 行出力してください。$i$ 行目には $(A, B) = (A_i, B_i)$ のときの答えを出力してください。

ただし、そのようなパスが存在しない場合、代わりに -1 を出力してください。

入力例 1
5 1 2 2 3 3 4 4 5 2 5 1 5 2
出力例 1
3

$G$ は次のようになります。

頂点 $5$ から頂点 $2$ へのパスは次の $2$ つが存在します。

  • 頂点 $5 \rightarrow$ 頂点 $2$
  • 頂点 $5 \rightarrow$ 頂点 $4 \rightarrow$ 頂点 $3 \rightarrow$ 頂点 $2$

よって、$2$ 番目に短いパスの長さは $3$ なので、$3$ を出力してください。

この入出力例は Easy・Normal・Hard の制約を満たします。

入力例 2
5 1 2 2 3 3 4 4 5 2 5 1 5 3
出力例 2
2

$G$ は入出力例1と同一です。

頂点 $5$ から頂点 $3$ へのパスは次の $2$ つが存在します。

  • 頂点 $5 \rightarrow$ 頂点 $2 \rightarrow$ 頂点 $3$
  • 頂点 $5 \rightarrow$ 頂点 $4 \rightarrow$ 頂点 $3$

よって、$2$ 番目に短いパスの長さは $2$ なので、$2$ を出力してください。

長さ $2$ のパスが $2$ つありますが、これらは区別されることに注意してください。

この入出力例は Easy・Normal・Hard の制約を満たします。

入力例 3
9 1 2 2 3 3 4 4 5 5 6 1 6 4 7 7 8 6 9 1 8 9
出力例 3
7

$G$ は次のようになります。

この入出力例は Normal・Hard の制約を満たします。

入力例 4
15 8 13 11 14 8 11 3 12 6 8 2 15 3 9 5 15 2 9 2 11 7 15 5 10 1 5 4 11 7 11 3 1 2 10 13 2 7
出力例 4
5 6 2

$G$ は次のようになります。

この入出力例は Hard の制約を満たします。

提出
C++23 (g++ 12.2.0)