📜  门| GATE-CS-2015(套装1)|问题 27(1)

📅  最后修改于: 2023-12-03 14:58:30.343000             🧑  作者: Mango

门 | GATE-CS-2015(套装1)|问题 27

本题为 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 为阈值。因此,该算法的时间复杂度和空间复杂度均与输入规模相关,能够满足本题的要求。