207. 课程表

package leetcode;

import java.util.ArrayList;
import java.util.List;

public class demo_207 {
    int[] visited;
    List<ArrayList<Integer>> array;
    //表示是否能够完成
    boolean isvalid=true;
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        visited=new int[numCourses];
        array=new ArrayList<ArrayList<Integer>>();
        //创建一个拓扑图的邻接表
        for(int i=0;i<numCourses;i++) {
            array.add(new ArrayList<Integer>());
        }
        //nums[1]必须在nums[0]之前,所以是nums[1]指向nums[0]
        for(int[] nums:prerequisites) {
            array.get(nums[1]).add(nums[0]);
        }
        for(int i=0;i<numCourses;i++) {
            //为0表示当前节点还未被访问过
            if(visited[i]==0) {
                dfs(i);
            }
        }
        return isvalid;
    }
    
    public void dfs(int v) {
        //为1表示当前值正在被访问
        visited[v]=1;
        for(int u:array.get(v)) {
            if(visited[u]==0) {
                dfs(u);
                if(!isvalid) {
                    return ;
                }
            }
            else {
                //表示当前节点所指向的一个节点也正在被访问,即存在一个环,不能完成
                if(visited[u]==1) {
                    isvalid=false;
                    return ;
                }
            }
        }
        //为2表示当前节点的相邻节点已经被访问完,回溯到当前节点
        visited[v]=2;
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        demo_207 demo=new demo_207();
        int[][] prerequisites= {{1,0},{1,2},{0,1}};
        System.out.println(demo.canFinish(3, prerequisites));
    }

}

 

posted on 2022-04-13 16:46  一仟零一夜丶  阅读(21)  评论(0)    收藏  举报