📅  最后修改于: 2023-12-03 14:58:30.343000             🧑  作者: Mango
本题为 GATE-CS-2015(套装1)的第27道问题。该问题是一道程序设计题目,要求考生实现一个程序,能够判断给定的有向无环图(DAG)是否存在一条从源节点到汇节点的路径,路径上的权值之和不超过给定的阈值。
输入分为两部分:
第一部分为 DAG 的节点数目 n 和边数目 m,用空格分隔,如下所示:
n m
接下来的 m 行,每一行表示 DAG 的边,其中每一个数对 (u, v, w) 表示 DAG 中的一条由节点 u 指向节点 v 的边,并且该边的权值为 w。数对中的数用空格分隔:
u v w
第二部分为给定的阈值 K。
输出只有一行,如果 DAG 存在一条从源节点到汇节点的路径,路径上的权值之和不超过给定的阈值,则输出 YES,否则输出 NO。
本题需要使用动态规划算法,具体实现如下:
def is_path_below_threshold(n, m, edges, threshold):
# 初始化二维矩阵dp
# dp[i][j] 表示从源节点到节点 i 的一条路径,路径上的权值之和不超过 j
# 初始值为 False,表示不存在路径
dp = [[False for _ in range(threshold + 1)] for _ in range(n)]
# 初始化终点,终点的 dp 值都为 True
sink = set()
for u, v, _ in edges:
sink.add(v)
for i in range(n):
if i in sink:
dp[i][0] = True
# 根据 DAG 中边的关系更新dp
for u, v, w in edges:
for j in range(threshold - w + 1):
if dp[u][j]:
dp[v][j+w] = True
# 判断存在一条从源节点到汇节点的路径,路径上的权值之和不超过给定的阈值
for j in range(threshold + 1):
if dp[n-1][j]:
return "YES"
return "NO"
本题使用动态规划算法,时间复杂度为 O(mK),其中 m 为边数目,K 为阈值。空间复杂度为 O(nK),其中 n 为节点数目,K 为阈值。因此,该算法的时间复杂度和空间复杂度均与输入规模相关,能够满足本题的要求。