最近在做求有向无环图的最长路径的问题,当然,求最长路径有许多方法,比如可以直接用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[]来记录拓扑排序的结果。