leetcode--CourseScheduleII

思路:

先判断有没有环,再进行拓扑排序。

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

/**
 * Created by marsares on 15/6/24.
 */
public class CourseScheduleII {
    List<Integer>[]adj;
    boolean[] marked;
    Stack<Integer>stack=new Stack<Integer>();
    boolean[]marked1;
    boolean[]onStack;
    boolean canFinish=true;
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        adj=new List[numCourses];
        for(int i=0;i<numCourses;i++){
            adj[i]=new ArrayList<Integer>();
            marked1=new boolean[numCourses];
            onStack=new boolean[numCourses];
        }
        for(int i=0;i<prerequisites.length;i++){
            int from=prerequisites[i][0];
            int to=prerequisites[i][1];
            adj[from].add(to);
        }
        for(int i=0;i<numCourses;i++)dfs1(i);
        return canFinish;
    }
    public void dfs1(int v){
        if(!canFinish)return;
        marked1[v]=true;
        onStack[v]=true;
        for(int w:adj[v]){
            if(!marked1[w])dfs1(w);
            else if(onStack[w])canFinish=false;
        }
        onStack[v]=false;
    }
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        if(!canFinish(numCourses,prerequisites))return new int[0];
        marked=new boolean[numCourses];
        for(int i=0;i<numCourses;i++){
            adj[i]=new ArrayList<Integer>();
            marked[i]=false;
        }
        for(int i=0;i<prerequisites.length;i++){
            adj[prerequisites[i][1]].add(prerequisites[i][0]);
        }
        for(int i=0;i<numCourses;i++){
            if(!marked[i])dfs(i);
        }
        int[]order=new int[numCourses];
        for(int i=0;i<numCourses;i++){
            order[i]=stack.pop();
        }
        return order;
    }
    public void dfs(int v){
        marked[v]=true;
        for(int w:adj[v]){
            if(!marked[w])dfs(w);
        }
        stack.push(v);
    }
    public static void main(String[]args){
        CourseScheduleII csii=new CourseScheduleII();
        int[][]prerequisites={{1,0},{0,1}};
        int[]order=csii.findOrder(4,prerequisites);
        for(int i=0;i<order.length;i++){
            System.out.print(order[i]+" ");
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值