拓扑排序

关联数据结构:有向无环图

public class Graph{
 
   // 顶点个数
   private int v;
    
   // 邻接表
   private LinkedList<Integer> adj[];
    
   public Graph(int v) {
       this.v = v;
       adj = new LinkedList[v];
       for(int i = 0; i < v; ++i) {
           adj[i] = new LinkedList<>();
       }
   }
    
   // 顶点s指向顶点t 
   public void addEdge(int s, int t) {
       adj[s].add(t);
   }
}

拓扑排序有两种实现方式:Kahn算法和DFS深度优先搜索算法

Kahn算法

Kahn算法使用的是贪心算法的思路。

如果一个顶点的入度为0,即该顶点没有依赖于任何其他顶点,那么就可以先执行该顶点。

Kahn算法不断在图中寻找入度为0的顶点,将其加入到结果序列中,然后将该顶点删除;循环执行上述过程,直至图中所有顶点被删除。

public void topoSortByKahnn() {
    // 统计每个顶点的入度
    int[] inDegree = new int[v];
    for(int i = 0; i < v; ++i) {
        for(int j = 0; j < adj[i].size(); ++j) {
            int w = adj[i].get(j);
            inDegree[w]++;
        }
    }
    
    LinkedList<Integer> queue = new LinkedList<>();
    for(int i = 0; i < v; ++i) {
        if(inDegree[i] == 0) {
            queue.add(i);
        }
    }
    
    while(!queue.isEmpty()) {
        int i = queue.remove();
        System.out.print("->" + i);
        for(int j = 0; j < adj[i].size(); ++j) {
            int k = adj[i].get(j);
            inDegree[k]--;
            if(inDegree[k] == 0) {
                queue.add(k);
            }
        }
    }
    
}

DFS算法

f