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

实现思路
- 核心采用时间驱动的事件调度逻辑,不需要用普通广度优先搜索(BFS),普通BFS按遍历层级处理无法精准匹配时间延迟要求
- 用最小堆(优先队列)管理所有待触发的打印事件,堆内每个元素为
(预计触发时间戳, 目标节点名称),堆会自动按触发时间升序排序,永远优先处理最早到期的事件 - 多前驱指向同一节点的场景无需特殊处理:每个前驱路径生成独立的触发事件,天然支持同一节点多次触发、多次打印的需求
- 完整执行流程:
- 初始化优先队列,将起始节点的触发事件加入队列(默认起始节点延迟为0,启动立刻触发)
- 队列不为空时,弹出堆顶最早到期的事件
- 计算当前时间与事件触发时间的差值,等待对应时长
- 打印当前事件对应的节点
- 遍历该节点的所有出边,按边权重计算下一级节点的触发时间,生成新事件压入队列
- 循环执行直到队列为空
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")
执行效果说明
上述测试代码运行后输出顺序和时间点如下:
- 程序启动立刻打印
Start - 启动后5秒打印
B - 启动后7秒打印
C - 启动后9秒(7+2)再次打印
B
该逻辑可直接适配任意多层、多入边的有向带权图场景,无需额外修改。
内容的提问来源于stack exchange,提问作者cj215
相关产品推荐
相关产品推荐

