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

如何按边权重对应的时间顺序打印有向无环图(DAG)的节点?

示例有向带权图

实现思路
  • 核心采用时间驱动的事件调度逻辑,不需要用普通广度优先搜索(BFS),普通BFS按遍历层级处理无法精准匹配时间延迟要求
  • 用最小堆(优先队列)管理所有待触发的打印事件,堆内每个元素为(预计触发时间戳, 目标节点名称),堆会自动按触发时间升序排序,永远优先处理最早到期的事件
  • 多前驱指向同一节点的场景无需特殊处理:每个前驱路径生成独立的触发事件,天然支持同一节点多次触发、多次打印的需求
  • 完整执行流程:
    1. 初始化优先队列,将起始节点的触发事件加入队列(默认起始节点延迟为0,启动立刻触发)
    2. 队列不为空时,弹出堆顶最早到期的事件
    3. 计算当前时间与事件触发时间的差值,等待对应时长
    4. 打印当前事件对应的节点
    5. 遍历该节点的所有出边,按边权重计算下一级节点的触发时间,生成新事件压入队列
    6. 循环执行直到队列为空
Python 代码实现
import heapq
import time

def delay_print_graph(graph: dict, start_node: str):
    # 优先队列存储结构:(触发时间戳, 待打印节点名)
    event_queue = []
    program_start_time = time.time()
    # 初始化起始节点事件,延迟0秒触发
    heapq.heappush(event_queue, (program_start_time, start_node))

    while event_queue:
        trigger_time, current_node = heapq.heappop(event_queue)
        # 等待到指定触发时间
        wait_seconds = trigger_time - time.time()
        if wait_seconds > 0:
            time.sleep(wait_seconds)
        # 打印节点
        print(current_node)
        # 遍历当前节点所有出边,生成下一级事件
        for next_node, edge_weight in graph.get(current_node, []):
            next_trigger_time = trigger_time + edge_weight
            heapq.heappush(event_queue, (next_trigger_time, next_node))

# 测试示例
if __name__ == "__main__":
    # 图结构定义规则:键为当前节点,值为(目标节点, 边权重)的列表
    demo_graph = {
        "Start": [("B", 5), ("C", 7)],
        "C": [("B", 2)] # 新增C指向B的边,权重为2
    }
    delay_print_graph(demo_graph, "Start")
执行效果说明

上述测试代码运行后输出顺序和时间点如下:

  1. 程序启动立刻打印Start
  2. 启动后5秒打印B
  3. 启动后7秒打印C
  4. 启动后9秒(7+2)再次打印B
    该逻辑可直接适配任意多层、多入边的有向带权图场景,无需额外修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:15:00