#yXTTJlydlt60x6703dc. 北大ACM队的远足 PKU ACM Team's Excursion
北大ACM队的远足 PKU ACM Team's Excursion
No testdata at current.
好的,这是整理好的题面,不含解题思路,只包含样例解释。
题目描述
给定一张 个点 条边的有向无环图,点的编号从 到 ,每条边都有一个长度。
给定一个起点 和一个终点 。
定义:
若从 到 的每条路径都经过某条边,则称这条边是必经边(桥)。
(注意:这里“桥”指的是在有向无环图的路径必经边,不是无向图的桥。)
北大 ACM 队要从 点到 点。
他们在路上可以搭乘两次车。
每次可以从任意位置(甚至是一条边上的任意位置)上车,从任意位置下车,但连续乘坐的长度不能超过 米。
除去这两次乘车外,剩下的路段步行。
定义从 到 的路径的危险程度等于步行经过的桥上路段的长度之和。
求从 到 的最小危险程度是多少。
如果没有从 到 的路径,输出 。
输入格式
第一行包含整数 ,表示共有 组测试数据。
每组测试数据:
第一行包含五个整数 。
接下来 行,每行三个整数 ,表示点 到点 存在一条有向边,长度为 。
输出格式
每组数据输出一行,表示最小危险程度。
数据范围
输入样例
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
样例解释
边(有向):
- 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
注意这里有重边(5→6 有两条,长度分别为 6 和 7)。
求必经边(桥)
在 DAG 中,一条边 是必经边当且仅当:
从 到 的路径数 × 从 到 的路径数 = 从 到 的路径数(路径数可能很大,可对一个大质数取模判断,或用拓扑递推布尔可达性判断必经)。
实际手动推导必经边比较繁琐,但题目允许我们乘车两次,每次乘车长度 ≤ ,可以覆盖一些必经边以减少危险程度。
最小危险程度目标
危险程度 = 步行经过的必经边的长度和。
我们要用两次乘车(每次长度 ≤ 7)覆盖尽量多的必经边长度。
已知答案输出是 1,说明最优方案下只有长度 1 的必经边未被覆盖(或必须步行)。
简单推断:
必经边可能只有一条或多条,用两次乘车(每次最多 7 长度)覆盖它们。
假设必经边总长度之和是 ,用两次乘车可以覆盖最多 的长度(但必须连续乘车,且要能选到包含这些边的路径)。
计算此例的必经边(省略推导过程,这是原题算法关键):
- 必经边集合可能包含 0→4(1)、5→6(选择某条)、6→7(5) 等等,但具体要程序判定。
最后最优乘车方案覆盖了大部分必经边,只留下长度 1 的必经边步行,所以危险程度 = 1。
因此输出 1。