zoukankan      html  css  js  c++  java
  • Leetcode207. Course Schedule

    PAT暂时没有题目练习拓扑排序,以下是Leetcode题目

    There are a total of n courses you have to take, labeled from 0 to n-1.Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]

    Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?

    Example 1:

    Input: 2, [[1,0]]
    Output: true
    Explanation: There are a total of 2 courses to take. To take course 1 you should have finished course 0. So it is possible.

    Example 2:

    Input: 2, [[1,0],[0,1]]
    Output: false
    Explanation: There are a total of 2 courses to take. To take course 1 you should have finished course 0, and to take course 0 you should also have finished course 1. So it is impossible.

    思路1:队列方法

    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        int m=prerequisites.size(),i,x=0;
        vector<vector<int>>g(numCourses);
        vector<int>in(numCourses,0);
        for(i=0;i<m;++i){
            int c1=prerequisites[i][0],c2=prerequisites[i][1];
            if(c1>=0&&c2>=0&&c1<numCourses&&c2<numCourses){
                g[c2].push_back(c1);
                in[c1]++;
            }
        }
        queue<int>q;
        for(i=0;i<numCourses;++i)if(in[i]==0)q.push(i);
        while(!q.empty()){
            int u=q.front();
            q.pop();x++;
            for(i=0;i<g[u].size();++i){
                in[g[u][i]]--;
                if(in[g[u][i]]==0)q.push(g[u][i]);
            }
        }
        if(x==numCourses)return true;
        else return false;
    

    思路2:dfs判断DAG(Directed Acyclic Gragh)

    vector<vector<int>>g;vector<int>visit;
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        int m=prerequisites.size(),i,x=0;
        g.resize(numCourses);
        visit.resize(numCourses,0);
        for(i=0;i<m;++i){
            int c1=prerequisites[i][0],c2=prerequisites[i][1];
            if(c1>=0&&c2>=0&&c1<numCourses&&c2<numCourses)g[c2].push_back(c1);
        }
        for(i=0;i<numCourses;++i)
            if(!visit[i]&&!dfs(i,x))return false;
        if(x==numCourses)return true;
        else return false;
    }
    bool dfs(int& u,int& dp){
        visit[u]=-1;
        for(int i=0;i<g[u].size();++i){
            if(visit[g[u][i]]==-1)return 0;
            else if(!visit[g[u][i]]&&!dfs(g[u][i],dp))return 0;
        }
        visit[u]=1;dp++;return 1;
    }	
    
  • 相关阅读:
    常用排序算法(七)归并排序
    常用排序算法(六)堆排序
    常用排序算法(五)选择排序
    常用排序算法(四)希尔排序
    常用排序算法(三)直接插入排序
    常用排序算法(二)快速排序
    常用排序算法(一)冒泡排序
    Linux内核中双向链表的经典实现
    回溯法
    迪杰斯特拉Dijkstra算法介绍
  • 原文地址:https://www.cnblogs.com/chanceYu/p/12036364.html
Copyright © 2011-2022 走看看