#B4387. [语言月赛 202508] 中转达人

[语言月赛 202508] 中转达人

题目背景

扶苏经常坐飞机旅行。对于从 AA 地到达 BB 地的旅行需求,共有两种方法可以解决,一是直接乘坐从 AA 地飞往 BB 地的飞,称为直飞;另一种是从 AA 地飞往另一个中间城市 CC,再从 CC 飞往 BB,称为经 CC 地中转。有时,从中间城市中转的价格比直飞更便宜。

题目描述

某航司的航线覆盖了 nn 个城市。城市从 11nn 编号。两个城市之间可能有航线,也可能没有航线。一条航线可能会有两种票价,一是普通经济舱票价 Y,二是中转折扣票价 T。一些航线可能只有普通经济舱而不售卖中转折扣票。

对于从城市 uu 出发,到达城市 vv单向航线,用 Yu,vY_{u,v} 表示这条航线的普通经济舱票价,Tu,vT_{u,v} 表示这条航线的中转折扣票价。航线是单向的意味着:

  1. 可能 uuvv 有航线,但是 vvuu 没有航线;
  2. 可能 Tu,vTv,uT_{u,v} \neq T_{v,u},可能 Yu,vYv,uY_{u,v} \neq Y_{v,u}

扶苏共有 qq 个旅行计划,每个计划有一个出发城市 uu 和一个到达城市 vv,她将从城市 uu 出发,前往城市 vv。她有两种选择:

  1. 如果 uuvv 有直飞的航线,可以花费 Yu,vY_{u,v} 购买普通经济舱机票前往 vv
  2. 选择另一个城市 ww,使得 uuwwwwvv 均有中转折扣票售卖,然后花费 Tu,w+Tw,vT_{u,w} + T_{w,v} 元购买两程中转折扣票,经 ww 地中转到达 vv

扶苏会选择两种方案中花费较小的方案。当然,如果只有其中一种方案可用,她会选择该方案。

现在,给定飞机每条航线的机票价格,你要对每个旅行计划求出花费最小的方案的花费。

输入格式

第一行是两个整数,表示城市数量 nn 和计划数量 qq
接下来 nn 行,每行 nn 个整数,表示普通经济舱票价。第 ii 行的第 jj 个整数表示城市 ii 飞往城市 jj 的普通经济舱票价 Yi,jY_{i,j}。如果 iijj 没有航线,则 Yi,j=1Y_{i,j} = -1
接下来 nn 行,每行 nn 个整数,表示中转折扣票价。第 ii 行的第 jj 个整数表示城市 ii 飞往城市 jj 的中转折扣票价 Ti,jT_{i,j}。如果 iijj 没有航线或不售卖中转折扣票,则 Ti,j=1T_{i,j} = -1
接下来 qq 行,每行两个整数 u,vu,v,表示一个飞行计划。

输出格式

对于每个飞行计划,输出一行一个整数表示最小的花费。
如果该计划从 uu 无论如何无法到达 vv,输出 1-1

3 3
-1 5 10
15 -1 5
5 10 -1
-1 3 -1
-1 -1 1
-1 -1 -1
1 3
1 2
2 1
4
5
15

提示

测试点编号 nn \leq 特殊约定
1,21,2 33
3,4,53,4,5 100100 Ti,j=1T_{i,j} = -1
6,76,7 Ti,j1T_{i,j} \neq -1(对 iji\neq j
8,9,108,9,10

对全部的测试数据,保证 3n1003 \leq n \leq 1001q10001 \leq q \leq 10001Yi,j,Ti,j109-1 \leq Y_{i,j}, T_{i,j} \leq 10^9Ti,i=Yi,i=1T_{i,i} = Y_{i,i}= -11u,vn1 \leq u,v \leq nuvu \neq v。数据保证若 Yi,j=1Y_{i,j} = -1Ti,j=1T_{i,j} = -1