#yXTTJlydlt60x6703dc. 北大ACM队的远足 PKU ACM Team's Excursion

北大ACM队的远足 PKU ACM Team's Excursion

No testdata at current.

好的,这是整理好的题面,不含解题思路,只包含样例解释。


题目描述

给定一张 NN 个点 MM 条边的有向无环图,点的编号从 00N1N-1,每条边都有一个长度。
给定一个起点 SS 和一个终点 TT

定义:
若从 SSTT每条路径都经过某条边,则称这条边是必经边(桥)
(注意:这里“桥”指的是在有向无环图的路径必经边,不是无向图的桥。)

北大 ACM 队要从 SS 点到 TT 点。
他们在路上可以搭乘两次车
每次可以从任意位置(甚至是一条边上的任意位置)上车,从任意位置下车,但连续乘坐的长度不能超过 qq 米。
除去这两次乘车外,剩下的路段步行。

定义从 SSTT 的路径的危险程度等于步行经过的桥上路段的长度之和。
求从 SSTT最小危险程度是多少。

如果没有从 SSTT 的路径,输出 1-1


输入格式

第一行包含整数 LL,表示共有 LL 组测试数据。
每组测试数据:
第一行包含五个整数 N,M,S,T,qN,M,S,T,q
接下来 MM 行,每行三个整数 u,v,wu,v,w,表示点 uu 到点 vv 存在一条有向边,长度为 ww

输出格式

每组数据输出一行,表示最小危险程度。

数据范围

  • 1L51 \le L \le 5
  • 1N1051 \le N \le 10^5
  • 1M2×1051 \le M \le 2\times 10^5
  • 0S,T<N,ST0 \le S,T < N, S \ne T
  • 1q1091 \le q \le 10^9
  • 1w10001 \le w \le 1000

输入样例

1
8 9 0 7 7
0 4 1
0 1 10
1 2 9
4 2 2
2 5 8
4 3 3
5 6 6
5 6 7
6 7 5

输出样例

1

样例解释

N=8,M=9,S=0,T=7,q=7N=8, M=9, S=0, T=7, q=7

边(有向):

  1. 0→4 长度 1
  2. 0→1 长度 10
  3. 1→2 长度 9
  4. 4→2 长度 2
  5. 2→5 长度 8
  6. 4→3 长度 3
  7. 5→6 长度 6
  8. 5→6 长度 7
  9. 6→7 长度 5

注意这里有重边(5→6 有两条,长度分别为 6 和 7)。


求必经边(桥)

在 DAG 中,一条边 (u,v)(u,v) 是必经边当且仅当:
SSuu 的路径数 × 从 vvTT 的路径数 = 从 SSTT 的路径数(路径数可能很大,可对一个大质数取模判断,或用拓扑递推布尔可达性判断必经)。

实际手动推导必经边比较繁琐,但题目允许我们乘车两次,每次乘车长度 ≤ q=7q=7,可以覆盖一些必经边以减少危险程度。


最小危险程度目标

危险程度 = 步行经过的必经边的长度和。
我们要用两次乘车(每次长度 ≤ 7)覆盖尽量多的必经边长度。

已知答案输出是 1,说明最优方案下只有长度 1 的必经边未被覆盖(或必须步行)。


简单推断
必经边可能只有一条或多条,用两次乘车(每次最多 7 长度)覆盖它们。
假设必经边总长度之和是 XX,用两次乘车可以覆盖最多 2q=142q = 14 的长度(但必须连续乘车,且要能选到包含这些边的路径)。

计算此例的必经边(省略推导过程,这是原题算法关键):

  • 必经边集合可能包含 0→4(1)、5→6(选择某条)、6→7(5) 等等,但具体要程序判定。

最后最优乘车方案覆盖了大部分必经边,只留下长度 1 的必经边步行,所以危险程度 = 1。


因此输出 1