原题
207.课程表
2020年8月4日 每日一题
图的表示法
题解
方法一
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
int tiaojian[]=new int[numCourses];
List<List<Integer>> xian=new ArrayList<>();
Stack<Integer> cando=new Stack<>();
for(int i=0;i<numCourses;i++){
xian.add(new ArrayList<>());
}
for(int guanxi[]:prerequisites){
tiaojian[guanxi[0]]++;
xian.get(guanxi[1]).add(guanxi[0]);
}
for(int i=0;i<numCourses;i++){
if(tiaojian[i]==0){
cando.push(i);
}
}
while(!cando.isEmpty()){
int xianxiu=cando.pop();
numCourses--;
for(int houxiu:xian.get(xianxiu)){
tiaojian[houxiu]--;
if(tiaojian[houxiu]==0){
cando.push(houxiu);
}
}
}
return numCourses==0;
}
}
方法二
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
int tiaojian[]=new int[numCourses];
List<List<Integer>> xian=new ArrayList<>();
for(int i=0;i<numCourses;i++){
xian.add(new ArrayList<>());
}
for(int guanxi[]:prerequisites){
xian.get(guanxi[1]).add(guanxi[0]);
}
for(int i=0;i<numCourses;i++){
if(!sys(xian,tiaojian,i)){return false;}
}
return true;
}
public boolean sys(List<List<Integer>> xian,int tiaojian[],int i){
if(tiaojian[i]==1){return false;}
if(tiaojian[i]==-1){return true;}
tiaojian[i]=1;
for(int j:xian.get(i)){
if(!sys(xian,tiaojian,j)){return false;}
}
tiaojian[i]=-1;
return true;
}
}
方法一、方法二参考资料