如果想深入学习拓扑排序与关键路径(最长路径)的关系,建议学习博客:
https://blog.youkuaiyun.com/qq_40772692/article/details/84190698
拓扑排序是关键路径的实现基础
有两种实现方式:
1:dfs
2:queue
package 图论算法;
//参考博客
//https://blog.youkuaiyun.com/qq_40772692/article/details/84190698
//拓扑排序的两种实现算法之二:DFS算法(基于递归与数组标记)
//核心思路:用vis数组来标记节点状态:0表示未访问,1表示已经访问,-1表示正在访问。
//如某节点递归过程中发现子节点状态为-1,则说明图中有环!!
import java.util.Scanner;
import java.util.Stack;
public class 拓扑排序dfs实现 {
//新的发现,真的是一件很开心的事情,以后的函数的参数就可以少一点了
//把要用的array,stack,queue,arraylist,linkedlist都定义在这里就可以了。
static Stack s=new Stack<Integer>();
public static boolean dfs(int a,int n,int[]vis,int[][]map) {
vis[a]=-1;
for(int i=0;i<n;i++) {
//如果a到i有路
if(map[a][i]==1) {
//有环
if(vis[i]==-1) {
return false;
}
//若i未访问过但是访问后是-1还是有环
else if(vis[i]==0&&!dfs(i,n,vis,map