Longest Path in DAG 有向无环图中的最长路径问题

本文介绍了如何使用动态规划解决有向无环图(DAG)中的最长路径问题,这个问题在《算法导论》中被提及,是NP-Hard问题。通过拓扑排序和动态规划,可以在线性时间内找到起点s到其他所有点的最长路径。文章提供了代码实现,并强调了拓扑排序的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一次看见这个问题是 《算法导论》Chapter 15 动态规划课后思考题15-1的题目。
本文主要参考:http://www.geeksforgeeks.org/find-longest-path-directed-acyclic-graph/

问题描述

给定一个有向图(Directed Acyclic Graph)以及一个起点s,求该图中s点到其余所有点的最长路径。

题解

正如算法导论中提到的那样,给定有向图的最长路径问题并不如有向图最短路径那么简单,因为它不具备 最优子结构(Optimal Substructure Property)。实际上,该问题是NP-Hard问题。
但是,有向无环图的最长路径问题确有一个线性时间的解。这种思想和解决DAG最短路径问题相似,采用拓扑排序(Topological Sorting )。
我们将求得DAG的拓扑序列,那么对于拓扑序列,就可以用动态规划来处理。由拓扑序列的性质可以断定在拓扑序列该问题具有最优子结构。(当前问题的解包含子问题的解)
我们定义dist[v]为起点s到v的最长路径,那么递归关系为:

dist[v] = max{dist[pre] + weight(pre->v)},pre是一条指向v的边的起点

这里我们从左到右遍历拓扑序列,对于当前点i,更新其邻接点的dist。
需要强调的是这里的拓扑排序的实现方式是基于Dfs,需要掌握。

代码
#include <iostream>
#include <vector>
#include <stack>
#include <map>
#include <cstring>
#include <string>
#include <algorithm>
//#include <cmath> 
#include <utility>
#include <unordered_map>
#include <set>
#include <queue>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值