You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含负权边与环的至多7节点完全有向图指定长度路径查找

嘿,针对你这个至多7个节点的完全有向图找特定长度路径的需求,我来给你分享几个实用的思路和具体实现方法,完全适配你提到的允许环、到达终点后还能继续走的场景:

核心方案:动态规划(DP)

因为节点数最多才7个,规模很小,动态规划是最直接高效的选择——不管边权是正还是负,也不管路径里有没有环,都能轻松处理。

状态定义

咱们先定义dp[i][u]:它表示从起点出发走了i步后,到达节点u的所有可能路径的权重总和集合。如果你的需求只是判断是否存在这样的路径,那也可以把它改成布尔值,标记走i步到u是否可达。

状态转移逻辑

  • 初始状态:走0步肯定在起点,所以dp[0][起点] = {0}(权重和为0;如果是判断可达性,就设为True)
  • 每一步递推:对于第i步(从1到目标长度k),遍历每个节点u,然后找所有能指向u的节点v(也就是存在边v→u),把dp[i-1][v]里的每个权重值加上边v→u的权重,全部放到dp[i][u]里就行。

结果怎么拿

等计算到第k步的时候:

  • 要判断是否存在路径?看dp[k][终点]的集合是不是非空(或者布尔值是不是True)
  • 要找最大/最小权重的路径?直接在dp[k][终点]的集合里取最大或最小值就行
  • 要具体路径?可以在DP过程中额外记录每个状态的前驱节点,最后回溯就能还原出完整路径
进阶优化:矩阵快速幂

如果目标长度k特别大(比如几百上千步),用DP一步步递推有点慢,这时候可以用矩阵快速幂来加速,效率会高很多:

  • 可达性判断:用邻接矩阵的幂运算,矩阵乘法换成逻辑与/或——A^k的[起点][终点]位置就代表是否存在k步路径
  • 权重最值计算:重新定义矩阵乘法:C[i][j] = max(或 min)(C[i][k] + C[k][j]),然后计算矩阵的k次幂,A^k[起点][终点]就是你要的最大/最小权重
关于“到达终点后无需立即终止”的说明

其实这个情况已经被上面的方法完全覆盖了!因为DP和矩阵幂的思路允许路径中间任意位置出现终点,只要最后一步落在终点且总步数刚好是k就行。比如你先花2步走到终点,然后绕一个3步的环(终点→a→b→终点),总步数就是2+3=5步,完全符合要求——这种带环的路径会被自动纳入计算,不用额外做特殊处理。

代码示例(Python,判断可达性+求最大权重)
def find_k_length_path(n, edges, start, end, k):
    # edges格式:每个元素是(出发节点, 到达节点, 边权重)
    # 初始化DP数组:dp[步数][节点] 存储该步数下到对应节点的所有权重和
    dp = [[set() for _ in range(n)] for __ in range(k+1)]
    dp[0][start].add(0)  # 0步在起点,权重和为0
    
    for step in range(1, k+1):
        for current_node in range(n):
            # 遍历所有能到达current_node的边
            for from_node, to_node, weight in edges:
                if to_node == current_node:
                    # 把上一步到from_node的所有权重加上当前边的权重,加入当前状态
                    for prev_weight in dp[step-1][from_node]:
                        dp[step][current_node].add(prev_weight + weight)
    
    # 判断是否存在k步到终点的路径
    has_valid_path = len(dp[k][end]) > 0
    # 求最大权重(存在路径的话)
    max_path_weight = max(dp[k][end]) if has_valid_path else None
    return has_valid_path, max_path_weight

# 示例使用:4节点完全有向图
n = 4
edges = [
    (0, 1, 2), (0, 2, -1),
    (1, 2, 3), (1, 3, 5),
    (2, 1, 1), (2, 3, -2),
    (3, 0, 4), (3, 2, 2)
]
start_node = 0
end_node = 3
target_steps = 4
has_path, max_weight = find_k_length_path(n, edges, start_node, end_node, target_steps)
print(f"是否存在{target_steps}步路径: {has_path}")
print(f"该路径的最大权重: {max_weight}")

内容的提问来源于stack exchange,提问作者polarbits

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:11:12