一、拓扑排序
拓扑排序是基于依赖关系的节点,根据依赖关系而生成的序列。节点和依赖关系往往要生成有向无环图。类似的问题有:穿衣服裤子的先后关系,生成穿衣序列/专业课程与前置课程形成的课程学习序列/代码编译依赖关系形成的编译顺序序列。
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<>();
}
}
public void addEdge(int s, int t) {
// s先于t,边s->t
adj[s].add(t);
}
}
二、实现
0x00Kahn 算法
根据邻接表,很容易计算出每个节点的入度。
遍历每个入度,将入度为0的节点,放入队列。
队列不空,循环:
取出队首元素,输出他,然后遍历他的邻接节点,将邻接节点入度-1,如果邻接节点恰好为0,将节点放入队列。
时间复杂度:求入度:O(v+e),循环输出O(v+e)合起来O(v+e)
空间复杂度:入度数组O(v),队列<O(v)
public void topoSortByKahn() {
int[] inDegree = new