C++之求有向无环图的最长路径(拓扑排序+动态规划)

本文通过C++详细介绍了如何利用拓扑排序和动态规划求解有向无环图的最长路径。首先创建有向无环图,并进行拓扑排序,接着运用动态规划公式计算最长路径。最后,通过二维矩阵记录并找出最长路线,给出源代码供读者参考。
摘要由CSDN通过智能技术生成

        最近在做求有向无环图的最长路径的问题,当然,求最长路径有许多方法,比如可以直接用Floyd算法来求,只需稍微改动一下,不过用拓扑排序+动态规划来做,百度搜索了一下,介绍这方面的资料不够完善,也许会让许多人不够清楚实现原理,在这里,我讲解一下自己的一些思路,分成四部分进行编程:


      一、创建有向无环图:

      我用的数据存储结构是邻接矩阵,如果用邻接表也是可以的。这里就不多作解释,直接进入关键代码部分。

        

      二、拓扑排序:

      官方解释是:对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。

      用通俗的话来讲就是,比如你要选课A、B、C,但是读B要先选A,读A要先选C,所以,进行拓扑排序后,就是C、A、B。

      所以在创建图的时候,要用一个标志数组indegree[]来保存每个顶点的入度,另外,在进行下面求最长路径的时候,需要用到拓扑排序的结果,所以还需要一个数组topo[]来记录拓扑排序的结果。

  • 16
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值