题目描述:

思路:一开始完全没思路。看了题解后明白了,就是判断有向图是否存在环!深度优先和广度优先都可以做到。对拓扑排序熟悉那么就用广度优先解决吧。首先要根据输入得到图的入读和邻接表。之后就按正常的拓扑排序,入度0的入队列。每个出队列的顶点的相邻节点==顶点入读-1。直到队列为空,最后判断经过队列的顶点数和输入的数是否相等。
自己按照这个思路写代码时候发现两个注意点:1.题目中给出的前置课程的表示都是用的[A,B]这样的形式,也就是只有两个顶点。因此来构建邻接表时直接就可以用adjacencyList.get(tem[1]).add(tem[0]);来得到。2. 题目中给的[A,B],应该是A<-B,所以B才是前驱顶点,这点要注意,而且这时应该是A的入度增加。
class Solution {
List<List<Integer>> adjacencyList;
int[] inCount;
public boolean canFinish(int numCourses, int[][] prerequisites) {
inCount=new int[numCourses];
//创建空邻接表
adjacencyList=new ArrayList<List<Integer>>();
for(int i=0;i<numCourses;i++){
adjacencyList.add(new ArrayList<Integer>());
}
//填充邻接表及入读表
for(int[] tem :prerequisites){
adjacencyList.get(tem[1]).add(tem[0]);
inCount[tem[0]]++;
}
Queue<Integer> queue=new LinkedList();
for(int i=0;i<numCourses;i++){
if(inCount[i]==0){
queue.add(i);
}
}
int count=0;
while(!queue.isEmpty()){
count++;
int u=queue.remove();
for(int v:adjacencyList.get(u)){
inCount[v]--;
if(inCount[v]==0)queue.add(v);
}
}
return count==numCourses;
}
}
本文探讨了如何通过拓扑排序判断有向图是否存在环,以解决课程依赖关系问题。利用广度优先搜索实现拓扑排序,通过构建邻接表和入度数组,最终确定所有课程是否可以顺利完成。
5262

被折叠的 条评论
为什么被折叠?



