解决有向无环图(DAG)的判断
本题需要判断是否为有向无环图(DAG),主要思路是通过拓扑排序来判断。
拓扑排序思路:对 DAG 的顶点进行排序,使得对每一条有向边(u,v),均有 u(在排序记录中)比 v 先出现即可。
下面还用到了邻接表辅助,补充一下邻接表的概念,如下图以及对应的邻接表:
解题方法,参考题解:
- 拓扑排序+BFS
原理:从入度为0的节点开始广搜,每次删除连接的边并维护入度和节点数,把入度更新为0的节点再次加入队列,直到队列为空(把删除的顺序连接起来就是一种排序结果,这样能体现出拓扑排序的感觉)。如果剩余的节点数为0,则代表有一种包含所有节点的排序结果;若不为0,则拓扑排序失败。
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
//入度表
int[] indegrees = new int[numCourses];
//邻接表,用adj.get(i)拿取下标为i,代表编号为i的课程。(如果编号没有规范则需要一个Map?)
List<List<Integer>> adj = new ArrayList<>();
for(int i = 0 ; i < numCourses ; i++){
adj.add(new ArrayList<Integer>());
}
//BFS队列
Queue<Integer> que = new LinkedList<>();
//装载入度表和邻接表
for(int[] item : prerequisites){
//题意中[a,b]表示需要先学b,所以应该是a<-b
indegrees[item[0]]++;
adj.get(item[1]).add(item[0]);
}
//把入度为0的节点加入队列作为起始顶点
for(int i = 0 ; i < numCourses ; i++){
if(indegrees[i]==0) que.offer(i);