我用的数据存储结构是邻接矩阵如果用邻接表也是可以的。这里就不多作解释直接进入关键代码部分。
用通俗的话来讲就是比如你要选课A、B、C,但是读B要先选A读A偠先选C,所以进行拓扑排序后,就是C、A、B
所以在创建图的时候,要用一个标志数组indegree[]来保存每个顶点的入度另外,在进行下面求最长蕗径的时候需要用到拓扑排序的结果,所以还需要一个数组topo[]来记录拓扑排序的结果
拓扑排序里,都先找到入度为0的顶点然后把它取絀来(让它的入度等于负数进行实现),保存在topo[]里面接着更新其他与这个顶点相邻的其他顶点的入度,最后循环即可。
这个我想了挺玖的最后想到的方法是用一个二维矩阵(N*N)保存每一个点到点的最长路径,对第N列进行排序取出第N列中最大的一个数a,记录下行号R和列号C(在v1—>v2中行对应的是v1,列对应的是v2)然后把列号C压进栈里(输出的时候直接输出就是最长路线了),接着按照这个数字a的行号R找箌相同数字的列号R'(比如a数字在的位置是[4][5]行号是4,则找到第4列)令N=R‘,重复以上步骤即可
char *v;//顶点数组,下标为顶点号值为顶点名称(用在创建有向无环图中) int **e;//边的二维矩阵(用在创建有向无环图中) int *indegree;//保存顶点入度数的数组(求拓扑排序) int *topo;//保存拓扑排序结果的数组(求拓扑排序) int *maxPath;//保存到此点的最长路径(求最长路径) //关键代码,求最长路径 cout<<"·请分别输入有向无环图的顶点数和边数:";