#L4166. 「CCO 2024」Treasure Hunt

「CCO 2024」Treasure Hunt

题目描述

译自 CCO 2024 Day1 T1「Treasure Hunt」

佩里船长扬帆起航,在浩瀚的七海中冒险!他有一张藏宝图,上面标注了 NN 个岛屿,这些岛屿由 MM 条航线连接起来。第 ii 条航线连接着编号为 aia_ibib_i 的岛屿,航行这条路线(无论哪个方向)都需要花费 cic_i 个金币。看来,跟海怪搏斗可是一笔不小的开销啊!为了找到他的下一个大宝藏,佩里仔细勘察了这 NN 个岛屿,并确定了第 ii 个岛屿藏有价值 viv_i 个金币的宝箱。

现在,他需要计划好接下来的航程。佩里决定从岛屿 xx 出发,沿着一些航线(可能为空)航行,最后到达岛屿 yy。到达目的地后,他将打开岛屿 yy 上的宝箱,收取应得的战利品。

但有一个小问题:佩里迷失方向了,他不知道自己现在身在哪个岛屿!因此,对于每一个可能的出发岛屿 xx,他都想知道从该岛屿出发的所有航程中,他能赚到的最大金币数。假设佩里有很多金币,可以支付任何航线的通行费;他只关心航程的净收益(到达目的地的宝藏价值减去航行花费)。


输入格式

第一行包含两个用空格隔开的整数 NNMM,分别表示岛屿数量和航线数量。

第二行包含 NN 个用空格隔开的整数 v1,v2,,vNv_1, v_2, \ldots, v_N (0vi1090 \leq v_i \leq 10^9),表示每个岛屿的宝藏价值。

接下来的 MM 行,每行包含三个用空格隔开的整数 aia_i, bib_i (1ai,biN1 \leq a_i, b_i \leq N) 和 cic_i (0ci1090 \leq c_i \leq 10^9),分别表示第 ii 条航线连接的两个岛屿编号以及航行花费。

保证任何两座岛屿之间最多只有一条航线,并且每条航线连接的都是不同的岛屿。


输出格式

输出 NN 行,第 xx 行表示从岛屿 xx 出发所能获得的最大净收益(金币数)。


样例

输入

4 5
6 5 9 2
1 2 0
3 2 3
4 3 6
1 3 5
2 4 2

输出

6
6
9
4

样例解释

  • 对于第一个和第三个岛屿来说,最好的选择就是待在原地,直接打开岛上的宝箱。
  • 对于第二个岛屿,佩里可以航行到第一个岛屿并打开那里的宝箱。这样可以获得 60=66 - 0 = 6 个金币的净收益,这也是他能获得的最大净收益。
  • 对于第四个岛屿,佩里可以依次航行到第二个和第三个岛屿,然后打开第三个岛屿的宝箱。这样可以获得 923=49 - 2 - 3 = 4 个金币的净收益,这也是他能获得的最大净收益。

数据范围与提示

子任务 分值 NN 的限制 MM 的限制 额外限制
1 20 1N30001 \leq N \leq 3000 0M30000 \leq M \leq 3000
2 1N1061 \leq N \leq 10^6 0M1060 \leq M \leq 10^6 对于所有 iicic_i 只能为 0010910^9
3 28 M=N1M = N - 1 任何两座岛屿之间都存在唯一的一条航线路径(即图是一棵树)
4 32 0M1060 \leq M \leq 10^6