利用map来构成图,依据题中给的边缘列表构建邻接表,然后再建立入度表,从入度为0的顶点开始排序,如果到最后仍有顶点的入度不为0,则说明它的条件依然没有满足,则无法输出。
import java.util.HashMap;
import java.util.LinkedList;
import java.util.ArrayList;
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
Map<Integer,List<Integer>> map=new HashMap<>();//邻接表
Map<Integer,Integer> inDegreee=new HashMap<Integer,Integer>();//入度表
Queue<Integer> q=new LinkedList<Integer>();
for(int i=0;i<numCourses;i++){
inDegreee.put(i,0);
}
for(int[] t:prerequisites){
int cur=t[1];
int next=t[0];
inDegreee.put(next,inDegreee.get(next)+1);
if(!map.containsKey(cur)){
map.put(cur,new ArrayList<Integer>());
}
map.get(cur).add(next);
}
for(int i=0;i<numCourses;i++){
if(inDegreee.get(i)==0){
q.offer(i);
}
}
while(!q.isEmpty()){
int cur=q.poll();
numCourses--;
if(!map.containsKey(cur)){
continue;
}
for(int s:map.get(cur)){
inDegreee.put(s,inDegreee.get(s)-1);
if(inDegreee.get(s)==0){
q.offer(s);
}
}
}
return numCourses==0;
}
}
如果要输出课程顺序,可以维护一个int数组来存放每次poll出的数字
import java.util.LinkedList;
import java.util.ArrayList;
import java.util.HashMap;
class Solution {
public int[] findOrder(int numCourses, int[][] prerequisites) {
Map<Integer,List<Integer>> map=new HashMap<>();
Map<Integer,Integer> inDegree=new HashMap<Integer,Integer>();
Queue<Integer> q=new LinkedList<Integer>();
int[] res=new int[numCourses];
for(int i=0;i<numCourses;i++){
inDegree.put(i,0);
}
for(int[] t:prerequisites){
int cur=t[1];
int next=t[0];
inDegree.put(next,inDegree.get(next)+1);
if(!map.containsKey(cur)){
map.put(cur,new ArrayList<Integer>());
}
map.get(cur).add(next);
}
for(int i=0;i<numCourses;i++){
if(inDegree.get(i)==0){
q.offer(i);
}
}
int count=0;
while(!q.isEmpty()){
int t=q.poll();
res[count]=t;
count++;
numCourses--;
if(!map.containsKey(t)){
continue;
}
for(int s:map.get(t)){
inDegree.put(s,inDegree.get(s)-1);
if(inDegree.get(s)==0){
q.offer(s);
}
}
}
if(numCourses!=0) return new int[0];
return res;
}
}